2019/01/30

بالعربي Software Architecture Styles

في المقال السابق تكلمنا عن ما هو ال Software Architecture وما هي فوائد ان يكون بناء النظام يتبع Architecture Style معين.
في هذا المقال سوف نتناول بعض ال Architecture Styles ونتعرف على خصائصها وايضا سنجيب على التساؤل التالي:
هل يجب ان يتبع النظام كله Architecture Style واحد ام ممكن ان يتبع اكثر من Style.




ما هو ال Architecture Style

ال Architecture Style هو مجموعة من المباديء التي تقوم باتباعها اثناء بناء النظام لتشكل الشكل العام و الاطار العام لبنية النظام. وهذه المباديء هي مباديء عامة لتصميم النظام لتحل مجموعة من المشاكل التي قد تكون متكررة بين الانظمة. ولفهم ذلك تخيل معي انك تريد بناء نظام كبير Enterprise وتريد ان تفصل بين الكود المسؤول عن الواجهات UI والكود المسؤول عن ال Application Logic والكود المسؤول عن الحفظ في قواعد البيانات حيث لكل جزء سواء UI او Application Logic او Database Code فريق خاص به فماذا ستفعل فهذه مشكلة تريد حلها وبناء نظام يفصل بين هذه المراحل . انت الان لديك طريقين الاول ان تقوم بالاجتهاد لايجاد وسيلة لعمل هذا الفصل بين المراحل وهذا الحل لا افضله لك او ان تتبع بعض الاساليب التي تساعدك في عمل هذا الفصل لان هذه المشكلة واجهت ناس اخرين من قبلك وعلى مر الزمن تم صياغة بعض المباديء التي تتبعها لحل هذه المشكلة وهذا ما يسمى بال Architecture Styel.

ايضا ال Architecture Style قد يكون خاص بطريقة عمل الهيكل العام للكود او قد يكون لطريقة عمل ال Deployment للنظام او قد يكون خاص بطريقة الاتصال بين مكونات النظام.
Category
Architecture styles
Communication
Service-Oriented Architecture (SOA), Message Bus
Deployment
Client/Server, N-Tier, 3-Tier
Domain
Domain Driven Design
Structure
Component-Based, Object-Oriented, Layered Architecture

Layered Architectural Style

في هذا الStyle يتم تقسيم الهيكل الخاص بالنظام الى اكثر من طبقة متتالية وكل طبقة لا تتعامل الى مع الطبقة التي تسبقها فقط واشهر مثال لذلك هو تقسيم النظام الى اربع طبقات الطبقة الاخيرة هي قاعدة البيانات وتسمى ال Database Layer او ال Persestance Layer وهي عبارة عن البيانات التي يتم حفظها الطبقة التي تسبقها خاصة بالكود الذي يتعامل مع حفظ و استرجاع البيانات من قواعد البيانات ويطلق علىيها Data access layer والطبقة التي تسبقها هي التي بها ال Application Logic وتسمى ال Business Layer والطبقة الاولى هي التي تتعامل مع الواجهات UI Layer او ال Presentation Layerحيث ان ال UI Layer لا تتعامل الا مع ال Application Logic ولا تتعامل ابدا مع Data access layer  و ايضا ال Application Logic لا تتعامل مباشرة مع قاعدة البيانات ولكن كل التعامل يكون عن طريق ال  Data access layer.


وقد يطرأ الى ذهنك سؤال لماذا هذا التقسيم وما الذي ساستفيده منه؟
هذا التقسيم يساعد على تحقيق مبدأ ال Separation of cencerns لان كل جزء من الكود البرمجي معروف ما هي مسؤوليته ووظيفته ويضا تكون درجة الاعتمادية بين الطبقات منخفضة وهذا يؤدي الى تسهيل عملية الصيانة و التعديل داخل الكود. ومن ناحية اخرى يمكنك ادخال اكثر من مطور كل مكور يكون مسؤول عن كود معين فقد يكون احدهم مسؤول عن الواجهات وما يخصها (Frontend Developer) واخر مسؤول عن ال Application Business Logic (Backend Developer) وهكذا.

ملاحظة: قد يتطلب نظامك تقسيم عدد اكثر من الطبقات فلا مانع من ذلك.


Client/Server Architectural Style

هذا ال Style يهتم بطريقة ال Deployment الخاصة بالانظمة الموزعة التي يكون فيها اكثر من Client يتصل بـ Server وابسط مثال لهذا ال Style هي الانظمة التي يتم بنائها لتعمل على ال WEB ـ(Web Based) حيث يكون ال Client هو ال Browser على جهاز المستخدم والذي يتواصل مع ال Application Server عن طريق احد البروتوكولات المعروفة مثل HTTP. وقد يكون النظام الذي يتبع هذا ال Style هو عبارة عن Desktop Application وهو ال Client ويتواصل مع Application Server عن طريق اي بروتوكول وهكذا.



وفي هذا الStyle يكون (في الغالب) البيانات مخزنة في ال Server مما يعطي له بعض المزايا مثل انه يكون آمن اكثر لان البيانات مخزنة في ال Server وليس عند ال Client وايضا بمركزية الاتصال بالبيانات وايضا سهولة الصيانة. ولكن قد تضيف هذه المركزية بعض العيوب فمثلا في الغالب يكون ال Applicaion Logic مرافق للكود الخاص بقواعد البيانات مما يعطي صعوبة في الفصل بين المسؤليات وكلن هذا العيب ممكن تلافيه اذا تم تطوير هذا ال Style الى Multi-Tire Style .

N-Tier Architectural Style

هذا ال Style يهتم بعمل Deployment للنظام فهو مطابق لفكرة ال Layered Architectural Style ولكن كل Layer تكون على Physical Server مختلف فتخيل معي انك قمت بتصميم نظامك بال Layered Architectural Style وقمت بتصميم الية لاتصال كل Layer بالاخرى عن طريق بروتوكول معين او Interface معين وهذا اتاح لك امكانية عمل Deploy لكل Layer على Physical Server مختلف , اذا انت قمت بتطبيق ال N-Tier Architectural Style. اراك الان وقد ربطت ذلك بما سبق واعلم انك استنتجت ان ال Client Server Architecture هو نوع من ال N-Tier Architectural Style فهنيئا لك 😀😀 فهو بالفعل يسمى 2Tier Architecture.


والفائدة الاكبر من هذه الطريقة هي ال Scalability حيث انك تستطيع ان تستخدم اكثر من Server ليخدم نفس النظام مما قد يحسن الاداء.

Object-Oriented Architectural Style

هذا ال Style المقصود به تقسيم هيكل النظام الى Objects مستقلة يمكن اعادة استخدامها وكل Object يحتوي على الـData الخاصة به و ايضا ال Functions التي يقوم بها فمثلا تخيل معي انك تقوم بانشاء نظام لادارة عمليات البيع لمكان ما فقد يكون لديك Object او Class باسم الفاتورة Order وداخل هذه الClass يوجد البيانات الخاصة بها مثل التاريخ و اجمالي السعر والعميل وهكذا و ايضا تحتوي على Functions مثل اضافة فاتورة او حذف الفاتورة وهكذا. والطريقة البديلة لهذا ال Style كانت عن طريق بناء Functions بدون Objects لتنفيذ المهام بمعنى في المثال السابق بناء Function مستقلة تسمى CreateOrder و تاخذ Parameters مثل تاريخ الفاتورة و العميل و المنتجات وهكذا وتسمى هذه الطريقة Procedural instructions .
ولكن طريقة ال Object-Oriented تتميز انها تنظر للنظام بالكامل كانه مجموعة من ال Objects التي تكون مستقلة وقل اعتماديتها على بعضها البعض والتي قد تتواصل عن طريق Interfaces او Functions او Properties.
وبالطبع هذا ال Style له عدة معايير مثل ال Abstraction ,Inheritance ,Encapsulation , Polymorphism , Decoupling ويمكن القراءة اكثر عن ذلك عن طريق دراسة ال Object-Oriented Progrmming.


بالطبع ال OOP له مزايا متعددة اهمها هو تقليل الاعتمادية بين ال Objects مما يتيح لك امكانية عمل Test Automation بسهولة فكلما كان ال Design جيد كلما كانت الحياة سهلة في كل ما بعد ذلك سواء ال Implementation او ال Testing او ال Maintenance وهكذا وايضا قد تلجأ الى استخدام Design Patterns معينة في حل المشاكل التفصيلية البرمجية وهذا موضوع مقال قادم باذن الله.

Service-Oriented Architectural Style (SOA)

ي هذا ال Style يتم بناء النظام كمجموعة من ال Services المستقلة عن بعضها البعض كل Service تستطيع التواصل مع ال Service الالخرى بدون ان تعلم ما بداخلها ولكنها تعلم فقط معطيات هذه ال Service. ولفهم ذلك تخيل معي انك تقوم ببناء نظام خاص ببيع و شراء المنتجات اونلاين ولديك Mobile App يقوم الناس بالشراء منه و ايضا لديك موقع الكتروني ولديك برنامج على ال Windows وكلهم يبيعو و يشتروا داخل نفس النظام وانت تريد تطبيق ال SOA فقمت بعمل Service لعملية البيع و Service لعملية شحن المنتج للعميل و Service لعملية الدفع الالكتروني و هكذا فعند شراء العميل من اي من الانظمة الموقع ام الApp ام البرنامج يقوم بالتواصل مع Service البيع وارسال معطياتها من حيث المنتج و العنوان ووسيلة الدفع ثم تقوم هذه ال Service بالتواصل مع Service الدفع لتتم عملية الدفع ثم بعد التأكد من الدفع تتواصل مع Service الشحن لينزل امر التوريد والشحن وهكذا.
هذه ال Services يتم التواصل بين بعضها البعض و بين ال Clients الخاصة بها مثل الموقع ام الApp ام البرنامج بواسط بروتوكلات متعددة اشهرها عن طريق ال Http ويضا ب Formats متعددة اشهرها ال Json.


وهذا ال Style تم استنباط منه Style اخر يسمى Microservice سوف يكون موضوع مقال قدام باذن الله.

هل لابد ان يتبع النظام Style واحد

في الحقيقة لا يتبع النظام Style واحد ولكنه قد يكون متبع عدة Styles واظن انك قد استنبطت ذلك فتخيل معي انك قمت ببناء نظام باستخدام ال Layered Architectural Style وقسمته بالفعل لعدة طبقات واحدة لل Logic والاخرى للواجهات و اخرى لقواعد البيانات و قمت ببناءه ايضا باستخدام Service-Oriented Architectural Style فاستطعت ان تجعل اتصال بين ال Services التي قد تكون متواجدة في Layers مختلفة عبر ال Network باستخدام هذا ال Style فاستطعت ان تجعل كل Layer على Physical Server مختلف وبذلك تكون حققت N-Tire Architectural Style وايضا قمت بتصميم كل Service باستخدام Object-Oriented Architectural Style لتجعل التصميم سهل ويمكن تعديله واختباره بسهولة

انت الان اشكرت اكثر من Architectural Style لتبني نظامك , انت جميل لفعلك ذلك وانا سعيد لوصولك الى هنا 😁😁

الان بقي لك شيء واحد وهو ان تعمل Like لصفحتنا على Facebook وان تكتب تعليق اذا اعجبك المقال او اذا تريد المناقشة واعلم انك اذا لم تعمل Like فان ال الاسباجتي كود هو الذي منعك 😁😁😁 ولا تنسانا من صالح دعئك




ملحوظة ما تم ذكره هو بعض ال Architectural Styles وليس جميعهم كما ان كل Style له تفاصيل اكثر بكثير ولكن هذا المقال كان لتوضيح الرية العامة ويمكنك التبحر اكثر ان اردت.

مراجع

https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ee658117(v=pandp.10)
http://www.dailywebsolutions.com/what-is-client-server-architecture
http://pafel.net/2015/10/misc/software-architecture-layered-architecture/
https://dbinfoworld.wordpress.com/2014/11/09/different-types-of-database-architecture/
https://www.javatpoint.com/java-oops-concepts
https://www.ibm.com/support/knowledgecenter/en/SSMQ79_9.1.1.2/com.ibm.egl.pg.doc/topics/pegl_serv_overview.html




هناك تعليق واحد:

ayman يقول...

مشكوا جدا يا بشمهندس على هذا المقال الرائع
وبالطبع الموضوع يحتاج إلى تفصيل وتطبيق عملي

مقدمة عن الDevOps

في هذا المقال سوف اتحدث عن مقدمة بسيطة عن ال DevOps ولماذا لابد ان تهتم فرق تطوير البرمجيات به وما هي النتائج المترتبة عن استخدام اساليبه ...