لایه ها (Layer ها) در توسعه وب اپلیکیشن ها

با رشد کردن پیچیدگی اپلیکیشن ها یک روش بسیار مناسب برای مدیریت کردن آنها شکستن مسئولیت‌های مختلف و یا Concern های متنوع برنامه به قطعات کوچک تر می باشد. این موضوع و پیاده سازی Separation of Concern به عنوان یک اصل بسیار مهم می تواند نه تنها سازماندهی بهتری را در Code Base ایجاد کند بلکه به برنامه نویسان کمک کند تا بتوانند Functionality های مورد نظر خود را راحت تر پیدا کنند. معماری لایه بندی شده و یا Layered architecture که مزایای بیشتری نیز علاوه بر سازماندهی کد دارند که در ادامه به آن‌ها خواهیم پرداخت. در رابطه با اپلیکیشن های چندلایه توصیه می‌کنیم از بسته ی آموزش ویدئویی برنامه نویسی چند لایه در سی شارپ سری اول و بسته ی آموزش ویدئویی برنامه نویسی چند لایه در سی شارپ سری دوم دیدن کنید.

یکی از مزایای بسیار مهم سازمان بندی کردن پروژه در قالب لایه ها این است که Functionality های سطح پایین و مشترک می توانند در سرتاسر پروژه مورد استفاده مجدد قرار بگیرند. این استفاده مجدد از آن جهت اهمیت دارد که نیاز به کدنویسی بیشتر را از بین می‌برد و کدهایی که یک بار نوشته شده اند می توانند در سرتاسر برنامه مورد استفاده قرار بگیرند. با انجام این کار استانداردسازی مناسبی نیز در پیاده‌سازی اتفاق می‌افتد. در واقع این همان اصل DRY و یا Don’t Repeat Yourself می باشد که در قسمت های قبلی در رابطه با آن صحبت کردیم. برای یادگیری هرچه بهتر این است نیز می توانید از آموزش ویدئویی اصول سالید (SOLID) در برنامه نویسی شی گرا استفاده کنید.

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

علاوه بر این موضوع یکی دیگر از قابلیت هایی که با لایه بندی کردن برنامه و انجام Encapsulation به دست می‌آید قابلیت جایگزین کردن Functionality در برنامه می باشد. برای مثال در یک معماری لایه بندی شده یک اپلیکیشن ممکن است در ابتدا با بانک اطلاعاتی SQL Server عملیات Persistent سازی خود را انجام بدهد. همین اپلیکیشن ممکن است پس از مدتی راهبرد Persistent سازی خود را به پلتفرم Cloud تغییر بدهد و یا حتی از Web API استفاده کند. ضمنا برای یادگیری Web API می توانید از بسته ی آموزش ویدئویی طراحی و پیاده سازی RESTful API در ASP.NET Core 3 و بسته ی آموزش ویدئویی پیاده سازی مباحث پیشرفته RESTful API در ASP.NET Core 3 استفاده کنید. اگر در چنین شرایطی اپلیکیشن و معماری آن به خوبی لایه بندی شده باشند و Encapsulation را برای لحاظ کردن جزئیات مربوط به Persistent سازی در یک لایه منطقی قرار داده باشند، می توان لایحه مربوط به Persistent سازی با استفاده از بانک اطلاعاتی SQL را بدون حداقل تغییر در دیگر لایه ها با یک پیاده سازی دیگر برای کار کردن با یک بانک اطلاعاتی دیگر جایگزین کرد.

استفاده کردن از Interface ها در انجام چنین کارهایی بسیار اهمیت دارد. دلیل این موضوع نیز ایجاد کردن Loose Coupling در برنامه می باشد. در رابطه با اینترفیس ها می توانید از بسته ی آموزش ویدئویی اینترفیس ها در سی شارپ دیدن کنید. از دیگر قابلیت ها و مزیت های استفاده کردن از یک معماری لایه بندی شده امکان ایجاد کردن و نوشتن تست ها برای لایه های مختلف برنامه می باشد. تست نرم‌افزار امروزه یک موضوع بسیار مهم در توسعه نرم‌افزارهای موفق می باشد. در این رابطه نیز بسته های آموزشی متعددی تا به اینجای کار بر روی وبسایت پرووید منتشر گردیده اند که در صورت تمایل می توانید از انجام Unit Testing در سی شارپ و .Net Core با NUnit استفاده کنید.

با استفاده از معماری لایه بندی شده به راحتی می‌توان به منظور تست کردن نرم افزار پیاده سازی های واقعی را با پیاده‌سازی های قلابی و یا اصطلاحاً fake جایگزین کرد. به عبارت دیگر به جای نوشتن تست ها برای یک Data Layer و یا UI Layer واقعی در برنامه شما به سادگی می توانید این لایه ها را در زمان تست نرم افزار با پیاده سازیهای قلابی جایگزین کنید. این موضوع باعث می‌شود تا نوشتن تست ها بسیار تسریع گردد و اجرا شدن آنها نیز بسیار سریع انجام بشود. به عبارت دیگر با انجام این کار زیرساخت واقعی برنامه تست نمی‌شود و پیاده سازی های واقعی برنامه با پیاده‌سازی های قلابی جایگزین می گردند. این موضوع در نوشتن تست های واحد و یا همان Unit Test ها بسیار مناسب هستند. لحاظ کردن لایه های منطقی، یک تکنیک کاملا معمول در بهبود شرایط و سازماندهی کد در اپلیکیشن های تجاری به حساب می آید. روش‌های مختلفی نیز وجود دارد که با استفاده از آنها بتوانیم کد برنامه را در قالب لایه‌ هایی سازماندهی کنیم. در این قسمت در رابطه با تفاوت واژه Layer و Tier نیز با یکدیگر صحبت خواهیم کرد. واژه لایه نمایانگر یک تفکیک منطقی در یک اپلیکیشن می باشد. اما اگر یک اپلیکیشن و Logic مربوط به آن به صورت فیزیکی بر روی سرور ها و فرآیندها و Process های مختلف توزیع شده باشند این Deployment فیزیکی و تفکیک شده تحت عنوان Tier شناخته می شود. البته این موضوع کاملا امکان‌پذیر است که یک اپلیکیشن N-Layer را بر روی یک Tier تک قرار بدهیم. در رابطه با اپلیکیشن های چندلایه توصیه می‌کنیم از بسته ی آموزش ویدئویی برنامه نویسی چند لایه در سی شارپ سری اول و بسته ی آموزش ویدئویی برنامه نویسی چند لایه در سی شارپ سری دوم دیدن کنید.