OO مقابلالطبقات.موازنة "OO نقاء" مع الحصول على الأشياء القيام به

StackOverflow https://stackoverflow.com/questions/153394

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أؤمن OO, ولكن ليس إلى الحد الذي غير ملائمة التصاميم/تطبيقات ينبغي أن تستخدم فقط أن يكون "OO متوافقة".

حتى, كيفية التعامل مع Serlvet/EJB/DataContainer الطبقات المعمارية:

  • سيرفلتس تلقي طلبات استدعاء "طبقة رجال الأعمال" (مثلا ، الدورة EJBs)
  • طبقة رجال الأعمال يقع DataContainers من قاعدة البيانات و يتلاعب بهم لتنفيذ الأعمال المنطق
  • DataContainers لا تحتوي على رمز حقيقي, مجرد الحصول على/مجموعة المقابلة إلى قاعدة البيانات.

هذا النهج الاستئناف ؛ على DataContainers واضحة في ما يفعلونه وأنه من السهل جدا أن تعرف من أين تأتي البيانات من.

بجانب عدم OO, وهذا يؤدي إلى عدم وضوح طبقة رجال الأعمال الفئات التي يمكن أن يكون من الصعب الاسم من الصعب تنظيم.

حتى إذا كنا كانت تحاول أن تكون أكثر "OO" (مثلا ، وضع بعض من هذه الأساليب في DataConatiners), بعض من هذه العمليات تعمل على أكثر من مجموعة واحدة من البيانات.

كيف يمكنك الحفاظ على طبقة رجال الأعمال من الحصول على مشوش الإجرائية ، ولكن من دون تلويث الخاص بك DataContainers مع الأعمال المنطق ؟

على سبيل المثال

class UserServlet {
  handleRequest() {
    String id = request.get("id");
    String name = request.get("name");
    if (UserBizLayer.updateUserName(id,name))
      response.setStatus(OK);
    else
      response.setStatus(BAD_REQUEST);
  }
}

class UseBizLayer {
    updateUserName(String id, String name) {
        long key = toLong(id);
        user = userDAO.find(key);
        if user == null
            return false;
        if (!validateUserName(name))
            return false;
        user.setName(name);
        userDAO.update(user);
        return true;
    }

    validateUserName(String name) {
        // do some validations and return
    }
}

class User {
    long key;
    String name;
    String email;

    // imagine getters/setters here
}
  • نحن لا نريد validateUserName على المستخدم, منذ انها تعمل فقط على الاسم ؛ أعتقد أنه يمكن أن تذهب إلى فئة أخرى ، ولكن بعد ذلك لدينا آخر الإجرائية "uti" نوع الدرجة
  • نحن لا نريد استمرار الطرق على المستخدم, منذ هناك قيمة في فصل هياكل البيانات من استمرار استراتيجية
  • نحن لا نريد منطق الأعمال في بريمج, منذ قد نحتاج إلى إعادة استخدام هذا المنطق في مكان آخر
  • نحن لا نريد أعمالنا المنطق المستخدم لدينا ، هذا يعتمد كثيرا على فئة المستخدم ، مما يجعل إعادة استخدام منطق الأعمال الصعبة اقتران المستخدم مع استمرار استراتيجية

أنا أدرك أن هذا المثال ليس بهذا السوء, لكن تخيل 10 DataContainers و 20 BizLayer الكائنات مع عدة طرق بعضها.تخيل أن بعض تلك العمليات ليست "تركز" على وجه الخصوص البيانات الحاوية.

كيف يمكننا الحفاظ على هذا من كونه الإجرائية الفوضى ؟

هل كانت مفيدة؟

المحلول

لذا سوف تتناول أفكاري على هذا في بعض النقاط:

  1. يبدو في Java EE النظام في مرحلة ما لديك للتعامل مع السباكة Java EE, السباكة لا تستفيد دائما من OO المفاهيم ، لكنها بالتأكيد يمكن مع قليل من الإبداع والعمل.على سبيل المثال هل يمكن يمكن الاستفادة من الأشياء مثل AbstractFactory ، الخ للمساعدة commonize أكبر قدر من هذه البنية التحتية ممكن.
  2. الكثير من ما كنت تبحث في نوقشت في إيريك إيفانز كتاب ممتاز يسمى المجال يحركها التصميم.أنا عاليا أوصى يمكنك ننظر في الأمر كما يفعل معالجة مشكلة التعبير عن المعرفة في المجال و التعامل مع البنية التحتية التقنية لدعم ذلك.
  3. بعد قراءة و GROKD بعض DDD, وأود أن تغلف بلدي البنية التحتية التقنية في المستودعات.مستودعات سيكون كتبت إلى استخدام استراتيجية من أجل استمرار هذا مبني على الدورة EJBs.يمكنك كتابة تطبيق الافتراضي الذي يعرف كيف يتحدث إلى الدورة EJBS.لجعل هذا العمل, سوف تحتاج إلى إضافة القليل من الاتفاقية تحديد تلك الاتفاقية/العقد في الواجهات.مستودعات هل كل من الخام ينبغي أن لا تفعل أكثر من ذلك إذا كان هناك حاجة على الإطلاق.إذا قلت "يا DAOS هي مستودعات" ، ثم أود أن نوافق على ذلك.
  4. حتى أن نستمر في هذا.كنت بحاجة إلى شيء لتغليف وحدة العمل التي يتم التعبير عنها في UseBizLayer.في هذا المستوى أعتقد أن طبيعة هذا هو أن كنت عالقة كتابة التعليمات البرمجية هذا هو كل شيء سيكون الصفقة النصي.كنت تقوم بإنشاء الانفصال من مسؤولية الدولة.هذا هو عادة كيف رأيت ذلك من خلال Java EE النظم الافتراضية النوع من العمارة.ولكن ليس من وجوه المنحى.وأود أن محاولة استكشاف نموذج و أرى إن كان بإمكاني على الأقل محاولة commonize بعض السلوكيات التي هي مكتوبة في BizClasses.
  5. نهج آخر لقد استعملت من قبل للتخلص من BizLayer الطبقات ثم وكيل المكالمات من المجال الفعلي مستودعات/DAO يفعل العملية.ولكن هذا قد يتطلب بعض الاستثمار في بناء البنية التحتية.ولكن يمكنك أن تفعل الكثير مع إطار مثل الربيع و باستخدام بعض اوب مفهوم لجعل هذا العمل وكذلك خفض كمية مخصصة البنية التحتية اللازمة.

نصائح أخرى

بما أنك تنفيذ الفئات والكائنات ، الحل هو الذهاب إلى أن OO بغض النظر عن كيفية طبقة الأشياء - قد لا يكون جيدا جدا منظم اعتمادا على الوضع الخاص بك/الاحتياجات!;-)

كما أن السؤال الخاص بك محددة ، فإنه في بعض الحالات معنى validateUserName تنتمي إلى فئة المستخدم ، لأن كل مستخدم يود أن يكون اسم صالح.أو يمكنك التحقق من فئة فائدة على افتراض أن الأمور الأخرى الأسماء التي تستخدم نفس قواعد التحقق من الصحة.الشيء نفسه ينطبق على البريد الإلكتروني.هل يمكن تقسيم هذه إلى NameValidator و EmailValidator الطبقات التي سيكون حل جيد إذا أنها سوف تستخدم الكثير.هل يمكن أيضا توفير validateUserName الدالة على كائن المستخدم الذي فئة الأداة المساعدة الأسلوب.كل هذه الحلول الصالحة.

واحدة من أفراح كبيرة عن الجود/OOP هو أنه عندما التصميم هو الصحيح ، أعلم أنه هو الحق ، لأن الكثير من الأشياء تسقط من نموذج يمكنك أن تفعل ذلك أنت لم تفعل من قبل.

في هذه الحالة أود أن جعل NameValidator و EmailValidator الطبقات ، لأنه يبدو من المرجح أن الكيانات الأخرى سيكون لها أسماء وعناوين البريد الإلكتروني في المستقبل ، ولكن أود أن توفر validateName و validateEmailAddress وظائف على فئة المستخدم لأن هذا يجعل أكثر ملاءمة واجهة biz الكائنات للاستخدام.

بقية 'نحن لا نريد' الرصاص الصحيح ؛ فهي ليست فقط ضرورية لحسن طبقات ، لكنها ضرورية أيضا من أجل تنظيف OO التصميم.

طبقات OO تذهب يدا في قفاز على أساس الفصل بين المخاوف بين الطبقات.أعتقد أن كنت قد حصلت على فكرة الحق, ولكن سوف تحتاج إلى بعض المساعدة فصول مشتركة التصديقات كما قدم

التفكير في كيفية هذه المهام يمكن القيام به إذا كان هناك أي كمبيوتر ، نموذج النظام الخاص بك بهذه الطريقة.

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

هل العميل تخزين البيانات ؟ لا الموظف لا.ما هو دور الموظف أخذ عندما يكون تخزين العميل البيانات ؟ سجلات العميل حارس.

لا شكل تحقق من أنه تم تعبئتها بشكل صحيح ؟ لا الموظف لا.ما هو دور الموظف أخذ عندما يفعل ذلك ؟ شكل المعالج.

الذي يعطي العميل القطعة ؟ الموظف يتصرف باعتباره القطعة الموزع

وهلم جرا...

دفع هذا إلى Java EE تنفيذ...

بريمج يتصرف نيابة عن العميل ، ملء الاستمارة (سحب البيانات من طلب HTTP و القرارات المناسبة كائن جافا) و يمر إلى الموظف المناسب (EJB), من ثم لا مع شكل ما يجب القيام به.أثناء معالجة الطلب ، EJB قد تحتاج إلى تمرير جنبا إلى جنب إلى آخر EJB متخصصة في مهام مختلفة ، جزء من شأنه أن يشمل الوصول إلى/وضع المعلومات من/إلى التخزين (البيانات الخاصة بك طبقة).الشيء الوحيد الذي لا يجب أن الخريطة مباشرة إلى القياس يجب أن يكون على تفاصيل حول كيفية الأشياء الخاصة بك من التواصل مع بعضهم البعض, وكيف البيانات الخاصة بك طبقة يتصل مع التخزين الخاصة بك.

لدي نفس الأفكار نفسي.

في التقليدية MVC الشيء الأكثر أهمية هو فصل رأي من نموذج تحكم أجزاء.يبدو أن فكرة جيدة لفصل تحكم النموذج ببساطة لأنه يمكنك في نهاية المطاف مع المتضخمة نموذج الكائنات:


public class UserModel extends DatabaseModel implements XMLable, CRUDdy, Serializable, Fooable, Barloney, Baznatchy, Wibbling, Validating {
  // member fields
  // getters and setters
  // 100 interface methods
}

في حين يمكن أن يكون منفصل تحكم (أو كامل أنماط) للعديد من واجهات أعلاه ، نعم ، بل هي ذات طبيعة إجرائية ولكن أعتقد أن هذا هو كيف تسير الأمور في هذه الأيام.بدلا من ذلك يمكنك أن تدرك أن بعض الواجهات يفعلون نفس الشيء (الكريه - تخزين قاعدة البيانات واسترجاعها ، Serializable - نفس إلى تنسيق ثنائي XMLable نفس إلى XML) لذلك يجب إنشاء نظام واحد للتعامل مع هذا ، مع كل المحتملة الخلفية كونها منفصلة تنفيذ هذا النظام مقابض.الله, هذا هو حقا مكتوبة بشكل سيئ.

ربما هناك شيء من هذا القبيل "co-فئات" التي تتيح لك منفصلة الملفات المصدر تحكم تنفيذ هذا القانون كما لو أنهم عضوا في نموذج الطبقة أنها تعمل على.

أما عن قواعد العمل ، فإنها غالبا ما تعمل على نماذج متعددة في نفس الوقت ، وبالتالي فإنها يجب أن تكون منفصلة.

أعتقد أن هذا هو السؤال حول "الفصل بين المخاوف".يبدو أن طريق طويل إلى أسفل المسار الصحيح مع الطبقات المعمارية, ولكن ربما كنت بحاجة إلى أن تفعل أكثر من نفس - أيإنشاء المعمارية طبقات داخل Java EE الطبقات ؟

أ DataContainer يبدو الكثير مثل نقل البيانات الكائنات (DTO) نمط.

الحديث OO تصميم لديه الكثير من فئات صغيرة ، كل واحدة تتعلق عدد صغير من "الأصدقاء" ، على سبيل المثالعن طريق التكوين.هذا قد تنتج الكثير من دروس جافا المرجل لوحة من أنت حقا مريحة ، ولكن ينبغي أن يؤدي إلى التصميم الذي هو أفضل الطبقات أسهل اختبار الوحدة والحفاظ عليها.

(+1 السؤال +1 على الجواب حول متى كنت تعرف لديك طبقات صحيح)

بصورة فجة ، "نحن لا نريد" القسم يجب أن تذهب.سواء كنت تريد أن تكون على حق أو أنك تريد أن يبقى كما هو.لا يوجد أي نقطة في لا إنشاء فئة عندما كنت في حاجة واحدة."لدينا الكثير" سيئة عذر.

في الواقع ، هو سيئة فضح جميع الطبقات الداخلية ، ولكن في تجربتي ، وخلق فئة في مفهوم (أيمستخدم معرف قاعدة بيانات مفهوم...) يساعد دائما.

بجانب أنه ليس واجهة نمط ما حل وجود الكثير من BizRules فصول خفية وراء واحد تنظيما جيدا ونظيفة واجهة ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top