ورود

View Full Version : معماری چند لایه اصلا چی هست



marzban
چهارشنبه 27 تیر 1386, 10:29 صبح
با سلام
تایپک های موجود در این بخش در مورد معماری چند لایه رو خوندم ولی من یک مشکل دارم و اونم اینه که من فقط تا حالا بصورت معمولی برنامه نویسی می کردم و زیاد با این بحث آشنا نیستم .
لطفا معماری چند لایه را بصورت پایه ای توضیح دهید و اصولا چگونه تعریف می شود.
اگر ممکن است یک مثال فرضی هم بزنید تا برای فهمیدن مبتدیان ملموس تر باشد
با تشکر مرزبان

رضا عربلو
سه شنبه 02 مرداد 1386, 22:03 عصر
معماری چند لایه ای یعنی تقسیم منطق برنامه به لایه های تا حد ممکن مجزا، به منظور افزایش کارایی، استحکام، قابلیت اعتماد و ... نرم افزار.به طوری که تقییر یک لایه به راحتی و با کمترین تغییر در دیگر لایه ها انجام پذیر باشد.

marzban
سه شنبه 02 مرداد 1386, 22:59 عصر
ممنون از توضیح تون
لطفا یک نمونه فرضی مثال بزنید تا بهتر قابل درک باشد
با تشکر مرزبان

shotshat
یک شنبه 07 مرداد 1386, 08:24 صبح
من هم ممنون میشم اگه با یک مثال ساده معماری 3 لایه رو توضیح بدید چون من هر جا که گشتم فقط بحث تئوری معماری 3 لایه رو کرده بود و من الان برای نوشتن یک برنامه با معماری 3لایه واقعا سردرگمم!

Behrouz_Rad
یک شنبه 07 مرداد 1386, 10:44 صبح
نقل شده از وبلاگ بنده: معماری 3 لایه (http://brad.barnamenevis.org/?p=31)

معماری 3 لایه که این روزها در موردش زیاد شنیده میشه اصلا چیز عجیب و محیر العقولی نیست!
در این مقاله سعی می کنم این مفهوم رو با زبان ساده توضیح بدم.
همه میدونیم که دسته بندی موضوعات باعث میشه که رجوع به اونها سریع تر صورت بگیره.
تفکیک و در کنار هم قرار دادن مطالب مرتبط با هم به کارها نظم میده.
معماری چند لایه (n-tier) که متداولترین اون 3 لایه هست، از همین مفهوم برای پیاده سازی برنامه ها بهره میبره.
در معماری 3 لایه، برنامه رو به 3 قسمت (3 لایه) تقسیم می کنند و به هر قسمت (لایه) وظیفه ای رو محول میکنند.
این 3 قسمت شامل:
1) لایه ی دسترسی به داده ها (Data Access Layer که به اختصار DAL نامیده میشه)
2) لایه ی منطقی (Business Logic Layer که به اختصار BLL نامیده میشه)
3) لایه نمایش (Presentation Layer)

این لایه ها با همدیگه در ارتباط هستند و لایه ی منطقی، واسط لایه ی "دسترسی به داده ها" و "لایه ی نمایش" است.
به عبارت دیگه، لایه ی نمایش هیچگاه نمیتونه به صورت مستقیم با لایه ی دسترسی به داده ها ارتباط برقرار کنه.

روش ها و ابزارهای مختلفی برای ایجاد برنامه های 3 لایه وجود داره اما در تمامی این روش ها، فرآیند کار یکیست.
برای درک بهتر موضوع، بهتره که بحث رو با یک مثال عملی در #C ادامه بدیم.
پایین ترین لایه در معماری 3 لایه، لایه ی DAL هست.
در این لایه، متدهای دسترسی به پایگاه داده شامل اعمال DML و DDL انجام میگیره.
روال هایی همانند اضافه، حذف، آپدیت و بازیابی داده ها (اعمال DML) و ایجاد عناصر پایگاه داده در صورت نیاز (اعمال DDL)
به عنوان یک مثال ساده، من برنامه ای دارم که اطلاعات افراد شامل نام، نام خانوادگی، شماره تماس و آدرس اونها رو ذخیره و بازیابی می کنه.
قصد دارم تا این برنامه رو با استفاده از معماری 3 لایه پیاده سازی کنم.
حداقل 2 متد نیاز دارم. یکی برای ثبت داده ها در پایگاه داده و دیگری برای بازیابی داده ها.
پس ابتدا لایه ی DAL رو پیاده سازی می کنیم.
یک Class به پروژه اضافه و این دو متد رو در اون پیاده سازی می کنیم.
دستورات رو دیگه ننوشتم و به صورت شبه کد هستند. مطمئنا خودتون میتونید این کار رو انجام بدید:


Public class DAL
{
public void Insert(string pName, string pFamily, string pTel, string pAddress)
{
//do with INSERT statement
}
public DataSet GetPersons()
{
// do with SELECT statement
//return DataSet as result
}
}

بسیار خوب. لایه ی DAL ما به همین سادگی ایجاد شد!
حالا نوبت لایه ی منطقی یا BLL هست.
یک Class دیگه ایجاد می کنیم و نام اون رو BLL میگذاریم.
در این کلاس، دو متد (یکی برای فراخوانی متد Insert کلاس DAL و دیگری برای فراخوانی متد GetPersons این کلاس) ایجاد می کنیم:


public class BLL
{
public void Insert(string pName, string pFamily, string pTel, string pAddress)
{
DAL obj_DAL = new DAL();
obj_DAL.Insert(pName, pFamily, pTel, pAddress);
}
public DataSet GetPersons()
{
DAL obj_DAL = new DAL();
DataSet ds = new DataSet();
ds = obj_DAL.GetPersons();
return ds;
}
}

همان طور که میبینید، لایه BLL از متدهای لایه DLL استفاده کرده و وظیفه ی فراهم کردن داده های لازم برای لایه ی نمایش رو بر عهده داره.
البته کارهای دیگری نیز در لایه ی BLL انجام میگیره همانند بررسی صحت داده های ورودی.
شاید اینطور به نظر برسه که لایه ی BLL یک لایه ی اضافه است اما این لایه در حقیقت باعث میشه که اگر تغییراتی در لایه ی DAL ایجاد شد، کمترین آسیب به برنامه وارد بشه و خیلی راحت میشه این تغییرات رو با لایه BLL سازگار کرد.
در نهایت به لایه ی نمایش (Presentation) میرسیم.
این لایه همان اینترفیس یا محیطی هست که کاربر نهایی (End User) با اون سر و کار داره.
به عنوان مثال، فرم ورود اطلاعات در برنامه ی ما که حاوی چند TextBox و یک دکمه است.
کاربر اطلاعاتی رو در TextBox ها وارد می کنه و این اطلاعات با کلیک بر روی دکمه در پایگاه داده قرار میگیرند.
روال Click دکمه رو با استفاده از لایه ی BLL و به شکل زیر پیاده سازی می کنیم:


private void btnInsert_Click(object sender, System.EventArgs e)
{
BLL obj_BLL = new BLL();
obj_BLL.Insert(txtName.Text, txtFamily.Text, txtTel.Text, txtAddress.Text);
}

همان طور که دیدید پیاده سازی یک برنامه با معماری 3 لایه بسیار آسونه و منطق و فهم برنامه رو تسهیل میکنه.

موفق باشید.

marzban
یک شنبه 07 مرداد 1386, 18:07 عصر
خیلی ممنون از کمکتون آقای راد
خیلی خوب توضیح دادین ولی فقط کارایی لایه BLL هنوز کمی بر من پوشیده هست.
این لایه کمی به نظر می رسه که فقط بخاطر کم کردن کدهای Presentation Layer و مدیریت اون لایه هست.
البته اگر اشتباه می کنم لطفا راهنمایی کنید.
البته من بصورت ناخداگاه از همین روش استفاده می کردم یعنی کل فرآیند های بانک خودم را بصورت کلاسی و فایلهای dll تبدیل کردم(البته با راهنمایی که در گذشته کرده بودید)
و در بخش Presentation Layer از اون dll ها و کلاسها استفاده می کردم(البته خیلی به کدنویسی و خلاصه نویسی کمک کرد).
اگر در مورد BLL اشتباه میکنم لطفا راهنمایی کنید

Behrouz_Rad
یک شنبه 07 مرداد 1386, 19:49 عصر
به طور کلی، BLL وظیفه ی منطق تصمیم در برنامه و آماده سازی داده ها برای لایه های دیگه رو بر عهده داره.
این یک مفهوم کلیه و میشه مثال های متفاوتی برای اون بیان کرد.
BLL داده ها رو از DAL میگیره و به Presentation میفرسته و بالعکس.
BLL صحت و سقم داده ها رو بررسی می کنه.
BLL، داده ها رو به فرم مورد نظر در میاره.
BLL برای عملیات مختلف تصمیم های مناسب رو اتخاذ می کنه و ...

هدف از طراحی BLL اینه که در صورت تغییر در منطق برنامه، که توضیحات فوق از این جمله هستند، بشه با کمترین تغییر و هزینه این تغییرات رو در برنامه پیاده کرد.
اصولا منطق تصمیم گیری در برنامه به وسیله ی لایه ی BLL انجام میشه.
بیشترین بحثی هم که صورت میگیره بر سر همین لایه هست.
من در جایی خوندم که فردی که خودش رو تحلیلگر میدونست گفته بود که فرضا برای پیاده سازی یک کوئری که برای اجرای خودش نیاز به یک شرط داره، این شرط رو در BLL پیاده سازی کنیم و در صورت درست بودن اون، مجددا یک کوئری رو فراخوانی کنیم تا دستور مورد نظر رو اجرا کنه. در حقیقت با این کار دو Round-trip به سرور صورت میگیره اما بهایی بود که برای لایه ای کردن برنامه پرداخته میشد!

به عنوان یک مثال دیگه، فرآیند حذف یک رکورد رو از دیتابیس در نظر بگیر.
فرضا شرط تو اینه که اگر کاربر سطح دسترسی خاصی رو داشت، بتونه رکورد رو حذف کنه و در غیر اینصورت بهش پیغام داده بشه که مجوز این کار برای وی وجود نداره.
دیتابیس هیچ آگاهی و شعوری برای پیاده سازی این شرط نداره و این تویی که باید به طریقی که میدونی این مورد رو پیاده سازی کنی.
چون صحبت از شرط به میان آمد و یکی از مهمترین وظایف BLL پیاده سازی منطق تصمیم در برنامه است، پس این وظیفه رو به این لایه میسپاریم.
مثلا در ASP.NET به شکل زیر میشه این مورد رو بررسی کرد:


If HttpContext.Current.User.IsInRole("Admin") Then
'Create an Instance of DAL class and Call Delete Method
'Return 1
Else
'Return 0
End If

من سعی کردم با ذکر مثال وظیفه ی این لایه رو واست تشریح کنم.
امیدوارم مفید بوده باشه.

موفق باشید.

marzban
یک شنبه 07 مرداد 1386, 20:51 عصر
واقعا دست تون درد نکنه و حرفی دیگه باقی نمی مونه
خیلی مفید و مختصر گفتید.
اگه باز هم مباحثی در این مورد باقی می مونه لطفا بگید
باز هم ممنون
راستی یک سوال دیگه آیا چنین کاری رو بر روی بانک حالا مثلا sqlserver نیز می توان انجام داد
در واقع می توان بانک را هم لایه ای کرد

Behrouz_Rad
یک شنبه 07 مرداد 1386, 21:57 عصر
اگه باز هم مباحثی در این مورد باقی می مونه لطفا بگید
سوالی داشتید بپرسید.

راستی یک سوال دیگه آیا چنین کاری رو بر روی بانک حالا مثلا sqlserver نیز می توان انجام داد
در واقع می توان بانک را هم لایه ای کرد
این کار مفهومی نداره البته شاید بشه تفکیک کارها بین SP ها، Trigger ها، View ها و ... یک نوع از لایه بندی در سطح دیتابیس دانست!

موفق باشید.

mehdi.mousavi
دوشنبه 08 مرداد 1386, 01:01 صبح
حرفی دیگه باقی نمی مونه

اختیار دارید. حرف در این زمینه بسیاره... اگر بخوام تیتر وار چیزهایی که الان (ساعت 1.30 شب) به ذهنم میرسه رو در این رابطه بگم باید به موارد زیر اشاره کنم:

1. انتخاب Business Logic Object ها.
2. تفاوت بین three-tier application ها و three-layer application ها.
3. در هم آمیختن SOA با مفاهیم یاد شده و مفهوم DDD
4. ارتباط بین لایه ها.
5. مسائل امنیتی موجود بین لایه ها و و و ...

marzban
دوشنبه 08 مرداد 1386, 08:34 صبح
منظورم از حرفی دیگه باقی نمی مونه این نبود که کلیه مباحث مورد نظر گفته شده بلکه منظورم این بود که از چیزی که آقای راد فرموده بودند سر رشته مطلب را گرفتم.
با این حال معذرت.
اگه آقای راد لطف کنند و مطالب گفته شده دوست عزیز را ادامه بدهند خیلی ممنون می شوم
با تشکر مرزبان

roxana
شنبه 20 مرداد 1386, 00:22 صبح
دوست عزیز، لطفا اگر منبع جامع و کاملی در زمینه مطالب یاد شده سراغ دارید (کتاب، فیلم آموزشی، وب سایت) که این موضوعات را به صورت روشن و واضح توضیح داده باشند، معرفی فرمایید. (اگر به زبان انگلیسی هم باشد مشکلی نیست) پیشاپیش از لطف شما سپاسگزارم

babak.h
سه شنبه 06 شهریور 1386, 19:48 عصر
in VB.net :
http://msdn2.microsoft.com/en-us/library/aa581770.aspx

in C#.net :
http://msdn2.microsoft.com/en-us/library/aa581771.aspx

این مطالب مربوط به توسعه web application ها هست . البته برای رسیدن به یک دید کلی در مورد معماری 3 لایه قابل استفاده هستند.

kavehYn
چهارشنبه 09 آبان 1386, 18:36 عصر
سلام
از مطالبی که در این تاپیک ذکر کردید خیلی ممنونم ولی من دو سئوال دیگر دارم که اگر راهنمایی کنید من خیلی از ابهاماتم رفع میشه

1- فرض کنید درمورد همین فیلدهایی که مثال برای آنها طراحی شده ، میخواهیم کنترل کنیم که فیلد pName حتما مقدار داشته باشد . اینکار قطعا با یک دستور If انجام میشود .
فقط لطفا به من بگویید که محل قرار گیری این دستور در کجاست ؟ در Dal یا در BLL و در همان روال کلیک شدن برروی دکمه INsert ؟

2- تمام فرمها قبل از نمایش دادن نیاز به یکسری آماده سازی دارد . مثلا جعبه متنها باید پاک شود و اطلاعات مورد نیاز لیست باکسها باید از یک جدول خوانده شده و در داخل لیست باکس قرار داده شود .
.در یک معماری 3 سطحی چنین عملیاتی در کدام لایه اجرا میشود ؟ و توابعی که مثلا یک لیست باکس را مقداردهی میکند در کدام لایه قرار میگیرد ؟

خیلی از لطف شما ممنونم

aliebrahimi
پنج شنبه 10 آبان 1386, 00:05 صبح
سلام من یک برنامه نویس آماتور دلفی هستم که با OpenGL کار میکنم خیلی علاقه دارم معماری برنامه نویسی بدونم ( آخه رشتم نقشه برداریه ) یه PDF یا کتاب معرفی میکنید؟

mehdi.mousavi
پنج شنبه 10 آبان 1386, 00:07 صبح
سلام
از مطالبی که در این تاپیک ذکر کردید خیلی ممنونم ولی من دو سئوال دیگر دارم که اگر راهنمایی کنید من خیلی از ابهاماتم رفع میشه

1- فرض کنید درمورد همین فیلدهایی که مثال برای آنها طراحی شده ، میخواهیم کنترل کنیم که فیلد pName حتما مقدار داشته باشد . اینکار قطعا با یک دستور If انجام میشود .
فقط لطفا به من بگویید که محل قرار گیری این دستور در کجاست ؟ در Dal یا در BLL و در همان روال کلیک شدن برروی دکمه INsert ؟

2- تمام فرمها قبل از نمایش دادن نیاز به یکسری آماده سازی دارد . مثلا جعبه متنها باید پاک شود و اطلاعات مورد نیاز لیست باکسها باید از یک جدول خوانده شده و در داخل لیست باکس قرار داده شود .
.در یک معماری 3 سطحی چنین عملیاتی در کدام لایه اجرا میشود ؟ و توابعی که مثلا یک لیست باکس را مقداردهی میکند در کدام لایه قرار میگیرد ؟

خیلی از لطف شما ممنونم

1. این شرط باید در سه سطح Presentation Layer، Middle Layer و Data Layer تست بشه. منظورم از Data Layer بانک اطلاعاتی هستش. مثلا در بانک نباید این فیلد Nullable تعریف بشه. منظور از middle layer، همون Business Layer هستش که اونجا باید چک بشه که اگر مقدار نداشت، مثلا Exception مناسب throw بشه. اما این چک کردن باید در سطح Client هم رخ بده، تا اگر مقدار وارد شده توسط User، معتبر نبود، اصلا هیچ فراخوانی به Business Layer صورت نگیره.

2.تو یه معماری سه لایه، که بر اساس Office Automation Model طراحی شده باشه، همه اطلاعات از Business Layer بصورت Entity های مرتبط با هم گرفته شده و در Model ذخیره میشن. بعد Model، رویداد مثلا ModelChanged رو صادر میکنه و Form مورد نظر که قبلا خودش رو برای گرفتن Event های Model، ثبت کرده بوده، به محض گرفتن این event عمل مورد نظر خودش رو انجام میده که در این مورد، Refresh شدن محتویات ComboBox هستش.

hamed_bostan
جمعه 11 آبان 1386, 23:37 عصر
من فقط یه ایراد به این برنامه نویسی چند لایه معروف بگیرم که اطنقده همه واسه اش سر و دست می شکنن و اونم اینکه اگه بر حسب اتفاق فقط یه فیلد کوچولو تو دیتابیس بر حسب نیاز یا خواست مشتری که زیادم پیش میاد تغییر کنه باید این تغیرات در چند سطح اعمال بشه . من با برنامه نویسی چند لایه مخالف که نیستم هطچ خودم هم به همین روش کار میکنم اما همه حسنش رو گفتن منم گفتم عیبش رو بگم چون خیلی وقتا پدرم رو در اورده