الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ماهي الفلسفة التي تقوم عليها Spring ؟

بدأه Abdullah.Alshammeri في 10 أغسطس 2010 · 10 رد · 5,816 مشاهدة · في JavaEE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ،

العنوان فلسفي ، لكن هذا سؤال في أحد المقابلات الشخصية ..

جوابي كان :

اطار عمل يطبق مبدأ MVC !

الجواب شيء آخر ، يبدو لي أنه IOC أو ICS أو شيء زي كذا ( اختصار ، لا أذكره الآن ) .. هل يعرفه أحد ؟

المقصد ، هو أني أبحث هذه الأيام عن فريسة أتناولها خلال فترة فراغي ، ولا أعرف على أي أساس اختار Spring وليس JSF مثلاً ؟

هذه الـFrameworks الكثيرة ، كنت أعتقد أنها لها نفس الغرض .. ولكن فهمت لاحقاً أنها لها تصنيفات وأهداف مختلفة ، فبعضها يندرج تحت اسم Web Components و بعضها الآخر Web services .. أو شيء زي كذا ، لست متأكداً !

السؤال :

على أي أساس يتم تقييم " أطر الأعمال تلك " ، وعلى أي أساس يتم مقارنتها مع بعض لاختيار الأفضل ؟ ماهي المعايير ؟

واذا أردت أن أبني " مكتبتي الخاصة my framework " ، من أين ابدأ ؟ وكيف سأخطط لهذا المشروع مثلاً اذا كان المبرمج قد أنهى جزءاً لابأس به من JSP/Servlets .

كنت أظن في البداية أنك أمام MVC فقط ، ولكن يبدو الأمر أعقد ..

( لقد بحثت في القسم ولم أجد شيء واضح عن Spring بالذات ) .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

Spring .. أو أياً كان الـ Framework هو مجرد إطار عمل يوفر لك الكثير من الإمكانيات ويتبع الـ Best Practices في كثير من الأمور.

سأتحدث بصفة عامة .. ولا أتحدث عن إطار عمل بذاته ..

فمن المميزات التي يقدمها Spring وغيره .. على سبيل المثال وليس الحصر .. IoC أو Inversion of Control .. و Spring لم ينفرد بهذا ولم يخترعه. IoC عبارة عن فكرة وله عدة مشاريع خارجية تنفذ الفكرة فقط دون التطرق لباقي مميزات Spring مثلاً.

ببساطة ..

إذا كان لديك Class وهذا الـ Class يقوم ببناء Object من Class أخر في الـ Constructor الخاص به .. هكذا (اعذرني فلن أكتب إلا سي شارب والجافا تشبهها إلى حد كبير):

public class ClassA
{
   public ClassA()
   {
      ClassB b = new ClassB();
   }
}

public class ClassB
{
}

ستلاحظ أن ClassA يتحكم كلياً في الآتي:

1) توقيت بناء الـ Object من ClassB

2) وعندما يتم الانتهاء من العمل بـ ClassA سيتم العمل تلقائياً بالـ Object الخاص بـ ClassB لأن الأب الأساسي له مات.

هذه المشكلة تسبب الكثير من المشاكل وأهمها الـ Coupling الشديد بين الـ Classes فعلى سبيل المثال إذا كان ClassB في Assembly مختلفة عن ClassA .. وقمت بتعديل أي شيء في ClassB فعليك أن تقوم ببناء كلا الـ Classes مرة أخرى ولا يمكنك فقط استبدال الـ DLLs ببساطة ..

ظهر مصطح الـ Inversion of Control وذلك بمعنى أن نقوم بنزع السيطرة من ClassA على الـ ClassB .. وذلك عن طريق إيجاد شخص وسيط يقوم بالسيطرة على الجميع :D .. وهذا الشخص الوسيط يعمل في الخلفية بدون أي عوائق أعطيه تعليماتي يقوم بتنفيذها بدون أي تدخل مباشر في البرنامج ..

الهدف الرئيسي من الـ IoC و يرمز له أيضاً أحياناً بالـ Dependency Injection هو زيادة رقعة الاختبار للبرنامج Unit Testing Surface فكلما زاد الـ Decoupling كلما أصبح الـ Unit Testing أسهل وأقوى.

الشكل التالي يوضح فكرة عمل هذا الوسيط:

post-53551-040606300 1281428716_thumb.pn

وببساطة الوسيط هو الـ Builder فهو يقوم أولاً بعمل Object من ClassA ثم يقوم بعمل نسخة من ClassB أو في الشكل من ServiceA ثم يقوم بإعطاء ClassA النسخة التي قام بعملها من ClassB أو من ServiceA في الشكل .. تسمى هذه العملية Injection .. أو حقن .. وهو أن يقوم الـ Builder بحقن ServiceA داخل ClassA لأن ClassA يحتاج ServiceA ولهذا سميت Dependency Injection .. وأيضاً استطعنا أن ننزع سلطة ClassA عن ClassB عن طريق منح السلطة لشخص أخر يقوم بكل العمل خلف الستار دون كتابة سطر كود يذكر.

بهذا قمنا بتحقق الهدف وهو Decoupling بين كل الـ Components الخاصة بالتطبيق .. وأيضاً بزيادة رقعة الاختبار للبرنامج Unit Testing لأنك كلما قمت بزيادة الـ Decoupling يمكنك إذن اختبار كل Component على حدة بسهولة.

جزاك الله خيراً

المرفقات
Untitled.png

تم تعديل هذه المشاركة بواسطة أحمد عبد المنعم في 10 أغسطس 2010 في 11:33

4 −1

مدونة ابنتي الرضيعة: يوميات رزان

مدونتي التقنية العربية: البرمجة مع عبد المنعم

Technical Blog: Abdul Moniem's Thoughts

LinkedIn: Profile

#3

بخصوص الـ MVC .. أو Model View Controller .. هذه واحدة من الـ UI Patterns المنتشرة بشدة والتي تدعم أيضاً فكرة فصل الـ Logic عن الـ UI وبهذا يمكن اختباره بسهولة عن طريق الـ Unit Testing ...

هناك أيضاً أكثر من Pattern .. ومنهم على سبيل المثال لا الحصر: MVP - Model View Presenter ... أو MVVM - Model View ViewModel .. أو PM - PresentationModel .. ومعظم هذه الأفكار تكون أبحاث وتطبق بعد ذلك عن طريق الـ Frameworks المختلفة في الأسواق و Spring واحد منهم لا أكثر ولا أقل.

مدونة ابنتي الرضيعة: يوميات رزان

مدونتي التقنية العربية: البرمجة مع عبد المنعم

Technical Blog: Abdul Moniem's Thoughts

LinkedIn: Profile

#4

جرب تحصل على الجواب

عليك باستخدامه لفترة و بعدها ترى الفرق

#5

هل يمكنك أخي أن تكتب مثال على الكود الناتج في Framework?

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

جميل جدا أخ أحمد,, بارك الله فيك....

أخ شمري:

نستطيع أن نقول ال Spring مقابل لل EJB , فكلاهما وعاء تطبيقات Java EE ...

و كلاهما يقدم خدمات كثيره على سبيبل المثال لا الحصر , ال IoC كما شرح تفصيليا الأخي أحمد عبد المنعم, و خدمات أخري مثل AOP و إدارة العمليات (transaction management) و ال Timer services و الكثير...

أما ال JSF فهي إطار لبناء تطبيقات ويب, مثلها مثل ال struts, grails, jspx, gwt, strips, wicket و الكثير و الكثير و الكثير...

إذن هناك ثلاث أنواع أساسية من أطر الأعمال في الجافا (frameworks):

1- أُطر عمل الويب, كما ذكرت بالأعلى, و غالبا هذه الأطر ما تقوم بتطبيق النمط MVC

2- أطر عمل ال integration tire و يطلق عليها ORM , مثل Hibernate, JPA, toplink, eclipselink, JDO, sobat (ملحوظه, JPA , JDO عباره عن specs )

3- أطر عمل ال business tier , و أشهر واحده هي Spring (و يقابلها EJB ك specs كما ذكرت)

كل نوع من هذه الأنواع يقدم خدمات تسهل عمل المطور, فكلما كبر المشروع, كلما لجأ المطورين لهذه الأطر....

غالبا في هذه الأيام لا يمكن الإستغناء عن أطر العمل من النوع الأول (الويب)... فمعظم الشركات لم تعد تستخدم plain jsp/servlet

, كذكل بالنسبة لأطر العمل الثانيه (ORM), فمعظم الشركات أيضا لم تعد ستخدم plain JDBC

بالنسبة للنوع الثالث, فقط تجد بعض الشركات لا تستخدمه, لأن حجم المشاريع بها ليس كبير.

لكن بشكل عام, كل هذه الأطر تقدم خدمات رائعه لل business الذي يتسخدمها..

بقى نقطة واحده, الفرق بين إطارين من نفس الفئة يعتمد على عدة عوامل, من أهمها المعيارية, فمثلا في النوع الأول قد تجد بعض الشركات تفضل JSF فوق الجميع, فقط لأنها معيارية, و كذلك بالنسبة للنقطه الثالثه, فتجد بعض الشركات تفضل إستخدام EJB فوق Spring, على الرغم من أن Spring رائعه فعلا, إلا أن EJB معيارية من معاير الجافا..

2
#7
علاء الصالحي كتب:

هل يمكنك أخي أن تكتب مثال على الكود الناتج في Framework?

تحياتي

أخي علاء ..

هناك الكثير من الأطر التي تدعم الـ IoC كخاصية من ضمنها وهناك أطر خاصة فقط بالـ IoC مثل Windsor و Unity من ميكروسوفت و غيرها.

ماذا تقصد بالكود الناتج عن الـ Framework؟

مدونة ابنتي الرضيعة: يوميات رزان

مدونتي التقنية العربية: البرمجة مع عبد المنعم

Technical Blog: Abdul Moniem's Thoughts

LinkedIn: Profile

#8

بالنسبة لل Spring , فأنصحكم بكتاب Spring In Action .... كتاب رائع..

#9

أقصد لم أستطع فهم المثال المطروح وماهية الشكل الذي أرفقته أنت؟

هل عملية الفصل والتقليل من الاعتمادية تتم باستخدام AOP?

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

أنا لم أكن أتكلم عن ميزة معينة داخل Spring أو عن طريقة عملها ..

كنت أتحدث عن فكرة IoC بصفة عامة وهي التي يطبقها أي إطار يود تطبيق نفس الفكر مثل Spring في الجافا أو Spring.NET في الدوت نت.

مدونة ابنتي الرضيعة: يوميات رزان

مدونتي التقنية العربية: البرمجة مع عبد المنعم

Technical Blog: Abdul Moniem's Thoughts

LinkedIn: Profile

#11
اقتباس
. IoC أو Inversion of Control

هذا هو : )

شرحك واضح ، جزاك الله خير .

اقتباس
كنت أتحدث عن فكرة IoC بصفة عامة وهي التي يطبقها أي إطار يود تطبيق نفس الفكر مثل Spring في الجافا أو Spring.NET في الدوت نت.

قد يكون السؤال المطروح : كيف تقوم بتطبيق IoC برمجياً ( كلاسات Dummy ، فقط كمثال لتوضيح هذا المفهوم ، باستخدام #C) ، لأني لا أتصوّر صراحةً عملية Injection التي ستحدث ؟

اقتباس

إذن هناك ثلاث أنواع أساسية من أطر الأعمال في الجافا (frameworks):

1- أُطر عمل الويب, كما ذكرت بالأعلى, و غالبا هذه الأطر ما تقوم بتطبيق النمط MVC

2- أطر عمل ال integration tire و يطلق عليها ORM , مثل Hibernate, JPA, toplink, eclipselink, JDO, sobat (ملحوظه, JPA , JDO عباره عن specs )

3- أطر عمل ال business tier , و أشهر واحده هي Spring (و يقابلها EJB ك specs كما ذكرت)

هناك غيمة .. وانقشعت بعد قراءة تلك السطور ، هذا بالظبط ما أريده : ) ، لأني لم أكن أعرف العلاقة بين JSF و Spring و لا العلاقة بين EJB و Spring ولا حتى Hibernate بـSpring ، اذاً كل اطار عمل له مجاله و أهدافه ،

كنت بالفعل بدأت بـ JSF ولكن توقفت بعد أن " شاهدت أحد الشركات " تعتمد على Spring في عملها !

جزيتم خيراً .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

مواضيع مشابهة