برنامه نویسی شی گرا در VB.Net

امروزه برنامه‌های کاربردی بر پایه شئ‌گرایی استوارند. تکنولوژی NET. امکانات بسیار جالب و کاملی در این زمینه دارد این مقاله که از کتاب ارزشمند Developing windows-based applications with microsoft VB.net & C#.net برگرفته شده است به شما کمک می‌کند با مفاهیم و چگونگی استفاده از این امکانات آشنا شوید. مطالبی مانند کلاسها، اشیا، اینترفیس ها، چند ریختی و وراثت. همچنین می تواند به عنوان مرجعی برای استفاده از امکانات برنامه نویسی شئ گرا در VB.net قرار گیرد.




مقدمه ای بر برنامه نویسی شئ گرا


برنامه نویسی در محیط دات نت فریم ورک بر پایه اشیا انجام می گیرد. اشیا طرحهای برنامه پذیرند که می توانند نمونهایی از بسته های از دادهای مرتبط و دستورات باشند. اشیا طرحهای کامل و خاصی برای دیگر اعضای محیط برنامه هستند، بدون این که جزییات کارهای درونی خود شی مطرح شود. اشیا از یک قالب به نام کلاس ساخته می شود. کلاسهای کتابخانه ای پایه NET. یک سری کلاسهایی برای درست کردن اشیا در برنامهایتان آماده کرده اند. همچنین شما می توانید از محیط برنامه نویسی Microsoft Visual Studio برای درست کردن کلاسهای اختصاصی خودتان استفاده کنید. در این مقاله شما با مقدمات برنامه نویسی شئ گرا آشنا می شوید.

اشیا، اعضا و تجرد (Abstraction)

یک شئ (object) یک طرح برنامه پذیر است که چیزهایی ر ا نشان می دهد. در دنیای واقعی، ماشین، دوچرخه، کامپیوتر و... شئ هستند. هر کدام از این اشیا یک سری اعمال و خصوصیات دارند. در برنامه شما، یک شئ شاید یک فرم یا یک کنترل مانند یک دکمه(button) یا یک database connection یا هر طرح دیگری باشد. هر شئ یک واحد عملیاتی کامل است، و شامل همه دادهای مورد نیازش و دارای همه ی اعمالی که برای آن ساخته شده است می باشد.

کلاس ها (Classes)

کلاسها قالب هایی برای اشیا هستند. کلاسها را می توان، "طرحهای اولیه" برای اشیا فرض کرد. آنها تمام عضوهای یک شئ را تعیین می کنند، و رفتارهای یک شئ را تعریف می کنند. وقتی که یک کلاس مقدار دهی شد، یک نمونه درون حافظه ای از آن کلاس ساخته می شود. این نمونه شئ نامیده می شود. برای نمونه سازی از کلاس از کلمه کلیدی New استفاده می شود.


کد:




' Declares a variable of the Widget type

Dim myWidget As Widget

' Instantiates a new Widget object and assigns it to the myWidget

' variable

myWidget = New Widget()


وقتی یک نمونه از کلاس ساخته می شود، یک کپی از نمونه ی داده بوسیله آن کلاسی که در حافظه ساخته شده تعریف می شود و به مرجع متغییر داده می شود. هر نمونه از کلاس مستقل از دیگر نمونه هاست و می تواند یک طرح جداگانه‌ی برنامه پذیر باشد. درهر لحظه، محدودیتی برای تعداد کپی های یک کلاس (که قبلا تعریف شده) وجود ندارد. برای مقایسه، در جهان واقعی، اگر ماشین یک شئ باشد، کلاس یک طرح برای ماشین است. یک طرح می تواند برای هر تعداد ماشین مورد استفاده قرار گیرد و تغییرات برروی یک ماشین، تغییری بر دیگر ماشین ها نمی گذارد.

اشیا و اعضا(Members)
اشیا ترکیبی از عضوها هستند. اعضا، تشکیل شده از خصوصیات(Properties)، فیلدها، متدها و رویدادها (events) و هر چیزی که اطلاعات و اعمالی داشته باشد. فیلدها و خصوصیات، اعضای داده هر شئ‌ای هستند. متدها اعمالی هستند که شئ می تواند انجام دهد و رویدادها اطلاعاتی هستند که یک شئ به اشیا دیگر می فرستد یا از آنها دریافت می کند در زمانیکه اتفاقی در برنامه می افتد. در مثال واقعی مان، شئ ماشین، فیلدها و خصوصیاتی مانند Color ،Make ،Model ،Age، GasLevel دارد. این اطلاعات وضعیت شئ ماشین را توصیف می کند. شئ ماشین شاید چندین متد مانند Accelerate, shiftgears, turn داشته باشد. متدها رفتاری که شئ می تواند اجرا کند را نشان می دهند. ماشین شاید رویداد EngineOverheating از طرف شئ "موتورش" داشته باشد، یا وقتی با شئ "درخت" تعامل می کند، شاید رویداد "تصادف" برای آن اتفاق بیفتد.

کپسوله سازی( Encapsulation)

کپسوله سازی روشی است که یک شئ را مستقل از اینترفیسش پیاده سازی کنیم. یک برنامه با یک شئ بواسطه اینترفیسش تعامل می کند، که شامل خصوصیات عمومی و متدهایش است. تا زمانی که این اینترفیس ثابت باقی می ماند، برنامه می تواند به تعامل با کامپوننت ادامه دهد. حتی اگر پیاده سازی اینترفیس کاملا بین دو نسخه کاملا بازنویسی شده باشد. اشیا فقط از طریق متدها و خصوصیات عمومیشان با دیگر شئ ها تعامل می کنند. داده های داخلی یک شئ، نباید در اینترفیس قرار بگیرد. بنابراین فیلدها به ندرت Public تعریف می شوند. به مثال ماشینمان برگردیم: اگر شئ ماشین با شئ راننده تعامل کند، اینترفیس ماشین شاید شامل متدهای GoForward، Backward و متد Stop باشد. این همه‌ی اطلاعاتی است که راننده برای تعامل با ماشین نیاز دارد. ماشین شاید شامل شئ "موتور" نیز باشد، اما راننده نیازی به شناخت شئ موتور ندارد. همه اطلاعتی که راننده درباره این متدها دارد این است که می توانند فراخوانی شوند و آنها مقادیر ویژهای را برمی گردانند. بنابراین اگر شئ موتور تغییری کند، تا زمانیکه اینترفیس به درستی به کار خود ادامه می دهد این امر تفاوتی برای راننده ایجاد نمی کند.

چند شکلی(Polymorphism)

چند شکلی توانایی کلاسهای متفاوت، در پیاده سازی های مختلف از اینترفیسهای عمومی مشابه است. به عبارت دیگر، چندشکلی به متدها و خصوصیات یک شئ اجازه می دهد، بدون توجه به چگونگی پیاده سازی اعضای آنها، فراخوانی شوند. برای مثال شئ Driver می تواند بوسیله اینترفیس عمومی Car با شئ Car تعامل کند.اگر شئ دیگری مانند شئ Truck یا شئ SportCar اینترفیس عمومی مشابهی را داشته باشند، شئ Driver می تواند با آنها بدون توجه به پیاده سازی خاص آن اینترفیس تعامل کند این جا دو راه اصلی برای تامین چندشکلی وجود دارد: چندشکلی اینترفیس(interface polymorphism) و چندشکلی وراثتی (inheritance polymorphism).

چندشکلی اینترفیس(interface polymorphism)
اینترفیس یک قرارداد برای رفتار است. در واقع اینترفیس اعضای یک کلاس را تعیین می کند، اما توضیحاتی درباره‌ی پیاده سازی همه جزییات آن نمی دهد. یک شئ می تواند اینترفیسهای زیاد و متفاوتی را پیاده سازی کند، و کلاسهای متفاوت زیادی می توانند یک اینترفیس مشابه را پیاده سازی کنند. همه اشیایی که اینترفیس مشابهی را پیاده سازی می کنند می توانند با دیگر اشیا درون اینترفیس تعامل کنند. به عنوان مثال شئ car مثال قبل شاید اینترفیس IDrivable را پیاده سازی کند(به عنوان قرار داد، اینترفیس ها معمولا با I شروع می شوند)، که متدهای GoForward, GoBackward,Halt را تعیین می کند. کلاس های دیگر مانند Truck، Forklift یا Boat شاید این انیترفیس را پیاده سازی کنند و بنابراین می توانند با شئ Driver تعامل داشته باشند. شئ Driver از پیاده سازی انیترفیس که با آن تعامل دارد بی اطلاع است.

چندشکلی وراثتی (inheritance polymorphism)
وراثت به شما امکان می دهد که اعمال یک کلاس از پیش تعریف شده را، در یک کلاس جدید با هم ترکیب کنید و اعضای متفاوت مورد نیاز را در آن پیاده سازی کنید. کلاسی که از کلاس دیگری ارث می برد "مشتق" آن کلاس، یا "وارث" آن کلاس نامیده می شود. یک کلاس می تواند مستقیما فقط از یک کلاس ارث ببرد، که آن کلاس که از آن ارث می برد را کلاس پایه (base class) می نامند. کلاس جدید اعضای مشابهی با کلاس پایه دارد، و اعضای اضافی که مورد نیاز باشند می توانند افزوده شوند. به علاوه، در کلاس جدید بوسیله overriding پیاده سازی کلاس پایه، اعضای پایه می توانند تغییر کنند. کلاسهای وارث، همه ویژگی های کلاس پایه را نگه می دارند و می توانند با دیگر اشیایی که نمونه هایی از کلاس پایه هستند تعامل کنند. به عنوان مثال،اگر کلاس car یک کلاس پایه باشد، sportscar شاید کلاس مشتق شده از آن باشد. کلاس sportscar شاید کلاس پایه برای کلاس مشتق شده ی دیگری باشد مثل کلاس ConvertibleSportsCar. هر کلاس مشتق شده جدید، ممکن است اعضای اضافی را پیاده سازی کند، اما اعمالی که در کلاس اولیه car تعریف شده همچنان باقی می مانند.

Overloading اعضا
overloading به شما امکان می دهد که چندین عضو با نام مشابه درست کنید. هر عضوی که همنام با عضو دیگری است باید امضای متفاوتی داشته باشد. overloading متداول ترین در متدهاست. شاید شما بخواهید عضوی درست کنید که بتواند ستهای متفاوتی از پارامترها را بپذیرد.


کد:




Public Sub Display(ByVal DisplayValue As Integer)
' Implementation Omitted

End Sub


این متد کاملا پذیرفتنی است. اما فرض کنیم که می خواهید به کلاینت اجازه دهید اگر نیاز بود پارامتر duration را انتخاب کند. یا اینکه شاید بخواهید متد بتواند مقادیر integer یا string را به عنوان پارامتر DisplayValue بپذیرد. در VB.Net اجازه دارید پارامترهای اختیاری داشته باشید. چاره کار overloading است. overloadها متدهای چندگانه هستند. متدهای overload شده باید امضا متفاوتی داشته باشد. اما نیاز ندارند مقدار بازگشتی و نوع و یا سطح دسترسی مشابهی داشته باشد. وقتی متد overload صدا زده می شود ، CLR(common language runtime) نوع آرگومانهای تحویل داده شده در فراخوانی متد را امتحان می کند. این سپس لیست آرگومان را با فراخوانیها و امضاهای Overload موجود به طور مناسبی تطابق می دهد. اگر هیچ Overload ای با نوع آرگومانها تناسبی نداشته، یک خطا اعلام می شود.

درست کردن متدهای overload
شما می توانید متد overload شده را از راهی شبیه آنچه دیگر متدها را می سازند درست کنید: بوسیله توصیف متد با یک نام، یک سطح دسترسی، یک نوع بازگشتی، و یک لیست آرگومان. یک متد overload شده باید نامی شبیه متد موجودی داشته باشد. اما باید امضای متفاوتی با آن داشته باشد. سطح دسترسی و نوع بازگشتی می تواند مشابه و یا متفاوت باشد. مثال زیر متد overload شده را نشان می دهد.

کد:




' This example demonstrates an overloaded method.
Public Sub DisplayMessage(ByVal I As Integer)

MessageBox.Show(I.ToString())

End Sub

' This method has the same name as the previous method, but is

' distinguishable by signature

Public Sub DisplayMessage(ByVal S As String)

MessageBox.Show(S)

End Sub

دو متد تعریف شده، با نام یکسان اما امضا متفاوت و پیاده سازی جداگانه. وقتی یک متد با نام DisplayMessage فراخوانی می شود، تست کننده runtime نوع آرگومان تحویل داده شده را تعیین می کند. اگر یک string تامین شود. متدی که string می گیرد صدا زده می شود. اگرinteger تعیین گردید متد Integer را فراخوانی می شود.

اینترفیس‌ها:
اینترفیس یک قرارداد است. هر شئ که پیاده سازی می شود، برای تامین پیاده سازی اعضای تعیین شده در آن اینترفیس یک ضمانت نامه اینترفیس می گیرد. اگر یک شئ نیاز به تعامل با اینترفیسی داشته باشد، می تواند با آن با هر شئ‌ای که آن اینترفیس را پیاده سازی می کند تعامل داشته باشد .

یک اینترفیس فقط اعضایی را تعریف می کند که بوسیله شیی که بعدا پیاده سازی خواهد شد ساخته می شود.تعریف اینترفیس هیچ چیزی درباره ی پیاده سازی اعضا نمی دهد. فقط پارامترهای که آنها می گیرند و نوع مقادیری که آنها برخواهند گرداند.پیاده سازی اینترفیسها کاملا به پیاده سازی کلاس واگذار می شود.

بنابراین این امکان دارد که در اشیا مختلف پیاده سازی های مختلف مهیجی از اعضای مشابه داشته باشیم. به عنوان مثال، اینترفیسی به نام Ishape که یک متد CalculateArea تعریف می کند. کلاس Circle این اینترفیس را برای محاسبه مساحت خود، به طریق متفاوتی با کلاس Square پیاده سازی می کند. هر چند که یک شئ که نیاز به تعامل با IShape دارد می تواند متد CalculateArea را فراخوانی کند و هر دوی Circle یا Square نتایج درستی می دهند.

تعریف اینترفیسها
اینترفیس ها با کلمه کلیدی interface تعریف می شوند.


کد:




Public Interface IDrivable
End Interface

این اعلان اینترفیس IDrivable را تعریف می کند. ، اما هیچ عضوی برای آن تعریف نمی کند. متدهای یک عضو باید با امضای متد تعریف شود، اما بدون access modifier هایی مثل public,private. و مانند اینها. access modifier ها ی یک اینترفیسaccess modifier اعضای آن اینترفیس راتعیین می کنند.پس اگر یک اینترفیس Public داشته باشید همه اعضایش هم باید هم public باشند. مثال زیر نشان می دهد که چطور متدها را به اینترفیس اضافه کنید :


کد:




Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)

Sub Halt()

Function DistanceTraveled() As Integer

End Interface

همچنین شما می توانید خصوصیات را به اینترفیستان اضافه کنید. خصوصیت باید ReadOnly یا WriteOnly تعریف شوند. مثال زیر را ببینید.


کد:




Public Interface IDrivable
' Additional member definitions omitted

' This defines a read-only property.

ReadOnly Property FuelLevel() As Integer

End Interface


اگرچه شما می توانید خصوصیات را در اینترفیسها تعریف کنید. اما نمی توانید فیلدها را در آنها تعریف کنید. این شرط تضمین می کند که کلاسهایی که از طریق اینترفیسها تعامل دارند به دادهای درونی یک شئ دسترسی نداشته باشند. اینترفیسها همچنین می توانند رویدادها را تعریف کنند:



کد:




Public Interface IDrivable
' Additional member definitions omitted

Event OutOfFuel(ByVal sender As Object, ByVal e As System.EventArgs)

End Interface



چند شکلی با اینترفیسها (Polymorphism with Interfaces)
هر شئ که یک اینترفیس خاص را پیاده سازی می کند، می تواند با هر یک از اشیا دیگری که به آن اینترفیس نیاز دارند، تعامل کند.


کد:




Public Sub GoSomewhere(ByVal V As IDrivable)
' Implementation omitted

End Sub


این متد نیاز به یک پیاده سازی از اینترفیس IDrivable دارد. هر شئ که این اینترفیس را پیاده سازی می کند می تواند به عنوان یک پارامتر به این متد پاس داده شود. وقتی یک شئ درون اینترفیسش تعامل می کند، فقط اینترفیس اعضا دردسترس هستند. شما همچنین می توانید به طور ضمنی اشیایی که اینترفیس خاصی را پیاده سازی می کنند درست کنید. مثال بعد نشان می دهد چگونه شئ Truck اینترفیس IDrivable را طراحی می کند. (توجه کنید در این مورد Truck باید IDrivable را پیاده سازی کند).


کد:




Dim myTruck As New Truck
Dim myVehicle As IDrivable

' Casts myTruck to the IDrivable interface

myVehicle = CType(myTruck, IDrivable)


پیاده سازی اینترفیسها
در VB.net اینترفیسها بوسیله کلاسها و ساختارها (structures) با کلمه کلیدی Implements پیاده سازی می شوند.


کد:




Public Class Truck
Implements IDrivable

' Additional implementation code omitted

End Class


کلاسها می توانند چندین اینترفیس را پیاده سازی کند. اگر بخواهید کلاسی تعریف کنید که چندین اینترفیس را پیاده سازی کند، می توانید اینترفیسها را با کاماهای جدا کنید. مثال زیر را ببینید.

کد:




Public Class Truck
Implements IDrivable, IFuelBurning, ICargoCarrying

' Additional implementation code omitted

End Class


وقتی یک کلاس یا ساختاری یک اینترفیس را پیاده سازی می کند. شما باید برای هر یک از اعضای آن اینترفیس پیاده سازی جداگانه ای انجام دهید. اگر اینترفیسهای چند گانه پیاده سازی شوند، باید یک پیاده سازی برای هر عضو هر اینترفیسی انجام دهید.

پیاده سازی اعضای اینترفیسها با VB.NET
در VB.Net یک عضو کلاس با کلمه کلیدی Implements یک عضو اینترفیس را پیاده سازی می کند. عضو کلاسی که عضو اینترفیس را پیاده سازی می کند باید امضایی مشابه آن چه در اینترفیس تعریف شده داشته باشد، اما نیاز نیست که سطح دسترسی مشابهی با آن داشته باشد. مثال بعد نشان می دهد چگونه یک عضو اینترفیس تعریف می شود.


کد:




Public Interface IDrivable
Sub GoForward(ByVal Speed As Integer)

End Interface

Public Class Truck

Implements IDrivable

Public Sub GoForward(ByVal Speed As Integer)

Implements IDrivable.GoForward

' Implementation omitted

End Sub

End Class


عضو کلاسی که یک عضو اینترفیس را پیاده سازی می کند مجبور نیست که نام مشابه با نام عضو اینترفیس داشته باشد مثال بعد یک پیاده سازی کاملا بی عیب متد IDrivable از اینترفیس GoForward است.


کد:




Public Sub Move(ByVal Speed As Integer)
Implements IDrivable.GoForward

' Implementation omitted

End Sub


هر فراخوانی متد GoForward از اینترفیس در مثال قبل متد Move را از کلاس پیاده سازی می کند. همچنین شما می توانید سطح دسترسی متفاوتی را برای- متد کلاسی که متد اینترفیس را پیاده سازی می کند - در نظر بگیرید. به عنوان مثال می توانید متد Public اینترفیس را متد Private کلاس پیاده سازی کنید. اگر این روش را انجام دهید، وقتی که دسترسی درون اینترفیس است متد Public می شود، اما وقتی دسترسی به عنوان عضوی از کلاس است private می ماند.

استفاده از ویژگی AutoComplete در ComboBox

یکی از ویژگی های Net Framework 2. به ComboBox اضافه شده ، ویژگی AutoComplete هستش . این ویژگی این امکان رو برای ما فراهم میکنه که هنگام تایپ کردن مقداری در ComboBox نزدیکترین معادل رو برای ما از لیست پیدا کند و به روشهای مختلفی که در ادامه توضیح داده میشه اون رو به مقدار وارد شده توسط ما اضافه کنه .
مطمئنا بسیاری از شما دوستان با این ویژگی آشنا هستید . من خودم تا قبل از این یه سری کد اضافی مینوشتم تا بتونم این ویژگی رو به ComboBox اضافه کنم و تصادفا متوجه شدم که ای دل غافل آب در کوزه و ما تشنه لبان میگردیم نیشخند می زنیم ، خود ComboBox این ویژگی رو داره و ما بی خبر . واسه همین گفتم شاید بعضی از دوستان هم مثل من از این ویژگی بی خبر باشن ، گفتم یه توضیحی بدم شاید مفید واقع بشه .
خوب بحث رو شروع کنیم .
ComboBox دارای سه Property با نامه های AutoCompleteCustom،AutoCompleteMode و AutoCompleteSource هستش که مربوط به این ویژگی میباشد که به ترتیب یه توضیح مختصری درباره این Property ها میدم .
AutoCompleteCustom: با استفاده از این Property شما میتوانید یک لیست انتخابی ایجاد کنید تا هنگامی که متنی در داخل ComboBox تایپ میشه نزدیکترین معادل رو از این لیست جستجو کنه . البته برای اینکه این لیست به عنوان مرجع قرار بگیره ، شما میبایست مقدار پراپرتی AutoCompleteSource رو برابر با CustomSource قرار بدید .
AutoCompleteMode: این پراپرتی دارای چهار مقدار Suggest ، Append ، SuggestAppend و None میباش که مقدار None مقدار پیش فرض میباشد .
در صورتی که مقدار این پراپرتی برابر با Suggest باشد ، در صورتی که معادلی نزدیک به مقدار تایپ شده در منبع تعیین شده پیدا شود ، لیستی در پائین ComboBox باز شده و معادلها در آن لیست نمایش میشود و شما میتوانید به دلخواه مقدار موردنظر خود را انتخاب کنید.
در صورتی که مقدار این پراپرتی برابر با Append باشد، نزدیکترین معادل به متن تایپ شده به ادامه متنی که شما تایپ کرده اید اضافه میشه .
در صورتی که مقدار این پراپرتی برابر با SuggestAppend باشد ، نزدکیترین معادل به متن تایپ شده به ادامه متنی که شما تایپ کرده اید اضافه شده و لیستی در زیر ComboBox باز میشود و سایر معادلها را در آن نمایش میدهد .
نکته: در صورتی که مقدار این پراپرتی برابر با SuggestAppend باشد و مقدار پراپرتی AutoCompleteSource برابر با ListItems باشد چند رفتار مختلف بصورت زیر بوجود میاد :
1. در صورتی که لیست خالی باشد ، فشار دادن کلیدهای Delete و Backspace هیچ کاری انجام نمیدهند .
2. در صورتی که Backspace در کمتر از یک ثانیه فشار داده شود ، گزینه قبل انتخاب میشود ، و یا درصورتی که لیست خالی باشد ، هیچ مقداری انتخاب نمیشود .
3. درصورتی که Backspace در بیشتر از یک ثانیه فشار داده شود ، اولین گزینه انتخاب میشود .
4. در صورتی که کلید Delete فشار داده شود ، اولین مقدار انتخاب میشود .

AutoCompleteSource: این پراپرتی دارای مقادیر زیر میباشد که درباره هر کدوم یه توضیحی میدم
AllSystemSources: تمام معادلهای موجود در FileSystem و URL ها را به عنوان منبع معادلگیری قرار میدهد.
AllUrl: معادلهای موجود در HistoryList و RecentlyUsedList را به عنوان منبع قرار میدهد .
CustomSource: مقدارهای وارد شده در AutoCompleteStringCollection(مقدارهائی که در پراپرتی AutoCompleteCustom وارد میکنیم) را به عنوان منبع معادل گیری قرار میدهد .
FileSystem:این یکی توضیح نمیخوادنیشخند می زنیم
FileSystemDirectories: تنها نام شاخه ها را به عنوان منبع قرار میدهد .
HistoryList: های موجود در History را به عنوان منبع قرار میدهد .
ListItems: مقدارهای ComboBox (مقدارهائی که در پراپرتی Items میتوان اضافه کرد) را به عنوان منبع قرار میدهد .
None: مقدار پیش فرض این پراپرتی که ویژگی AutoComplete را غیرفعال میکند .
RecentlyUsedList:آخرین URL های بازدید شده را به عنوان منبع قرار میدهد .

امیدوارم این مقاله کمکی به دوستان بکنه .
موفق باشید . گل برای گل

برنامه چندلایه چیست ؟

در معماری چند لایه تمام برنامه به چندین بخش تقسیم می‌شود. این بخش‌ها می‌توانند فیزیکی یا منطقی باشند. هر بخش کار خاصی را انجام می‌دهد مثلا نمایش interface کاربر یا دسترسی به داد‌ه‌ها. برنامه می‌تواند به هر تعداد لایه داشته باشد ولی به هر حال بیش‌تر برنامه‌ها سه لایه‌ی مجزا دارند که عبارت‌اند از:


Presentation Layer
Business Logic Layer
Data Access Layer


همان‌طور که احتمالا حدس زده‌اید، لایه‌ی Presentation چیزی نیست به جز بخشی از نرم‌افزار که با کاربر برنامه‌ی شما ارتباط برقرار می‌کند (interface برنامه‌ی شماست). نمایش داده‌ها به کاربر نهایی و اجازه به آنان برای ارتباط داشتن با داده‌ها، اصلی‌ترین وظیفه‌ی این لایه است.

در بیش‌تر موارد، داده‌هایی که توسط کاربر وارد می‌شوند نیاز به اعتبارسنجی یا پردازش اضافی دارند. این مسؤولیت لایه‌ی Business Logic است.

در نهایت داده‌های برنامه‌ی شما نیاز به ذخیره و بازیابی از طریق یک انبار داده دارند (مثلا سیستم مدیریت DataBaseهای رابطه‌ای یا RDBMS و یا XML و ...) این وظیفه توسط لایه‌ی دسترسی به داده انجام می‌شود.

به‌طور خلاصه، فرایند مورد نظر ما این‌گونه کار می‌کند:

- کاربر برای داده‌های برنامه، درخواستی ارسال می‌کند.

- لایه‌ی Data Access داده‌های مورد نظر را بازیابی می‌کند و از طریق لایه‌ی Business Logic آن‌ها را به لایه‌ی نمایش می‌فرستد. بعضی مواقع لایه‌ی دسترسی به داده‌ها، این داده‌ها را مستقیما به لایه‌ی نمایش ارسال می‌کند.

- لایه‌ی نمایش اطلاعاتی که باید نمایش داده شوند را از طریق لایه‌ی Business Logic دریافت می‌کند.

- کاربر داده‌ها را تغییر می‌دهد و عمل مناسب در مورد آن‌ها را اجرا می‌کند (مثل اضافه یا به‌روز کردن داده‌ها)

- لایه‌ی Business Logic صحت داده‌های وارد شده توسط کاربر را بررسی می‌کند (داده‌ها را اعتبارسنجی می‌کند)

- اگر داده‌ها معتبر باشند آن‌ها را برای به‌روز رسانی در بانک اطلاعاتی به‌دست لایه‌ی دسترسی به داده می‌سپارد.



مزیت‌های برنامه‌های چند لایه

- برنامه‌ها به چند بخش منطقی جدا از هم تقسیم می‌شوند و اتصال میان UI (رابط کاربری)، پردازش‌ها و بانک اطلاعاتی کم می‌شود.

- تغییر در بانک اطلاعاتی یا روال‌های دسترسی به داده‌ها، تاثیری در لایه‌ی نمایش یا برنامه‌ی کلاینت نخواهد گذاشت.

- برنامه‌ی کلاینت با عبارات SQL آمیخته نخواهد شد.

- نام جداول و ستون‌ها به‌طور مؤثری از برنامه‌ی Client حذف می‌شوند.

- برنامه‌ی Client نمی‌فهمد که داده‌ها از کجا آمده‌اند (چیزی که به آن Location Transparency گفته می‌شود)

- تغییر یا گسترش برنامه بسیار ساده‌تر خواهد شد، بدون نیاز به تغییر یا کامپایل مجدد برنامه‌ی Client.

نکته‌ی منفی در معماری چند لایه این است که شما باید تعداد زیادی بخش‌ها و کلاس‌های ازهم جدا در نرم‌افزار بسازید. اما به هر حال مزایای این روش بیش‌تر و برتر از معایب آن است.



انتخاب‌های لایه‌ی Presentation

دو انتخاب اصلی برای ساخت یک لایه‌ی نمایش در دات نت وجود دارد. آن‌ها فرم‌های ویندوزی یا فرم‌های وبی ASP.NET هستند.

با استفاده از ویندوز فرم‌ها شما می‌توانید برنامه‌های دسکتاپ فرم محور (Form Base) معمول را بسازید. برنامه‌های ویندوز فرمی می‌توانند المان‌های رابط کاربری بسیار غنی به‌کاربر پیشنهاد کنند. آن‌ها کم و بیش شبیه به فرم‌های ویژوال بیسیک هستند.

جذاب‌ترین گزینه برای توسعه‌ی لایه‌ی نمایش استفاده از وب فرم‌های ASP.NET است. کنترل‌هایی مثل: دیتاگرید، دیتالیست و تقویم (Calendar) یک رابط کاربری قدرتمند را با مقدار کمی کد فراهم می‌کنند.

انتخاب‌هایی که در بالا برای ساخت یک لایه‌ی نمایش بررسی کردیم می‌توانند توسط زبان‌های مختلفی مثل C#Visual Studio.Net پیاده‌سازی شوند.


انتخاب‌های لایه‌ی Business Logic

لایه‌ی Business Logic از چندین بخش که کارهایی نظیر اعتبار سنجی کار، گردش کار یا کارهای مشابه را انجام می‌دهند تشکیل شده است.

Componentهای .Net این لایه را شکل می‌دهند. شما می‌توانید با Interop از Componentهای COM استفاده کنید ولی این کار کارایی را پایین خواهد آورد.

وب‌سرویس‌های ASP.NET هم می‌توانند به‌عنوان یک Business Logic عمل کنند. اما به هر حال آن‌ها را نمی‌توان در همه‌ی شرایط به‌عنوان جایگزین Componentها به‌کار برد. وب‌سرویس‌ها تنها زمانی قابل استفاده خواهند بود که اعتبارسنجی در جایی بیرون از شبکه‌ی شما اتفاق افتاده باشد.

Componentهایی که توسعه می‌دهید به ماندن روی ماشین‌های مشابه نیازی ندارند. با استفاده از دات NET Remoting می‌توانید آن‌ها را روی چندین ماشین توزیع کنید.


انتخاب‌های لایه‌ی Data Access

این لایه با دستکاری داده‌ها مثل اضافه، حذف و به‌روز رسانی آن‌ها سر و کار دارد. داده‌هایی که به آن‌ها اشاره کردیم می‌توانند در RDBMS یا XML قرار داشته باشند. شما باید لایه‌ی دسترسی به داده را چنان طراحی کنید که دیگر لایه‌ها نیازی به دانستن وضعیت انبار داده‌ها نداشته باشند.

ADO.NET فناوری دسترسی به داده‌ی تحت دات .Net است. اگر چه ADO.NET از طریق کلاس‌های DataReader اجازه‌ی دسترسی به داده‌های در هنگام اتصال را می‌دهد ولی بیش‌ترین تمرکز روی دسترسی به داده‌ها در زمان متصل نبودن است. DataSet نقش کلیدی را در این مورد بازی می‌کند. در بعضی موارد می‌توانید ADO را هم برای دسترسی به داده‌ها استفاده کنید ولی استفاده از آن باید دلیل معتبری داشته باشد. از ADO استفاده نکنید فقط به خاطر این‌که RecordSetها را دوست دارید!

این‌جا هم Componentهای .Net لایه را تشکیل می‌دهند. همان‌طور که قبلا گفته شد می‌توانید از Componentهای کلاسیک COM هم استفاده کنید.

هم‌چنین وب‌سرویس‌ها هم می‌توانند لایه‌ی دسترسی به داده را شکل دهند. این مخصوصا زمانی درست است که DataBase شما فراهم‌کننده‌ی (Provider) داده ندارد. در این‌گونه موارد شما می‌توانید مقداری کد برای اتصال به داده‌ها و پر کردن DataBaseها و بازگرداندن نتایج درون DataSet به درخواست‌کننده‌ی داده بنویسید.

علاوه بر ADO.NET شما می‌توانید از امکانات سیستم مدیریت DataBase خود مثل توابع و یا روال‌های ذخیره شده (Stored Procedures) استفاده کنید.



ارسال داده از یک لایه به لایه‌ی دیگر

در تمام موارد به ارسال اطلاعات از یک لایه به لایه‌ی دیگر نیاز است؛ به‌طور معمول برنامه‌نویسان از رشته‌ها، آرایه‌ها، RecordSetهای غیرمتصل برای رسیدن به این هدف استفاده می‌کنند. در .Net ، DataSetها یک راه فوق‌العاده برای انتقال اطلاعات میان لایه‌ها فراهم می‌کنند. شما حتی می‌توانید با برنامه‌نویسی یک DataSet بسازید و آن را با داده‌های خودتان پر کنید. اگر اشیا را خیلی دوست دارید می‌توانید از Typed DataSets استفاده کنید که در واقع کلاسی مشتق شده از کلاس DataSet است که جداول و سطرها را به شکل یک شی معرفی می‌کند.



منبع :http://www.roshd.ir/