• 0
abshammeri

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

سؤال

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

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

جوابي كان :

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

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

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

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

السؤال :

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

10 إجابة على هذا السؤال .

  • 0

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 على حدة بسهولة.

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

تم تعديل بواسطه أحمد عبد المنعم
3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

أخ شمري:

نستطيع أن نقول ال 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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

تحياتي

أخي علاء ..

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
. 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 في عملها !

جزيتم خيراً .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .