هل يجب علي تحميل بيانات كائن Java الخاص بي عند الإنشاء، أم بشكل صريح من خلال استدعاء الأسلوب؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

هذا سؤال التصميم.أحاول الاختيار بين تطبيقين.

من أجل شرح هذا بشكل صحيح أحتاج إلى مثال.لذلك، على سبيل المثال:

لدي فصل دراسي يقوم بإنشاء تقرير حول، على سبيل المثال، قيم معينة لسوق الأوراق المالية في يوم محدد.أقوم بإنشاء StockMarketReportGenerator الكائن، ويمرر تاريخ اليوم، ويقوم بإنشاء تقرير بناءً على قيم السوق اليوم.

ال StockMarketReportGenerator "لديه" StockMarketData هدف.الغرض من StockMarketData الهدف هو احتواء جميع قيم سوق الأوراق المالية المخزنة في جدول (ربما يسمى StockMarket :)) في قاعدة البيانات، وبعض القيم الإضافية المحسوبة من بيانات الجدول.يحتوي على طرق خاصة تتصل بقاعدة البيانات، وتسترجع البيانات، وتقوم بالحسابات اللازمة، وتخزن القيم النهائية في متغيرات أعضاء الكائن.(ثم ​​يحتوي على أساليب getter للكشف عن هذه القيم، ولكن لا توجد أساليب ضبط.) StockMarketData الفئة هي في الأساس "حامل" لقيم بيانات سوق الأوراق المالية.لدي وظيفة مركزية واحدة تسمى شيء من هذا القبيل "calculateStockMarketData()" الذي يستدعي كل أساليب المساعدة الخاصة هذه ويقوم بإعداد الكائن.(أنا أدرك أن كل هذه المعالجة يمكن التعامل معها بسهولة أكبر من خلال إطار عمل مثل Hibernate؛ولكن تم اتخاذ القرار بتنفيذ ذلك يدويًا لأنه مشروع صغير جدًا ومؤقت إلى حد ما ولا يستحق الإعداد.)

سؤالي هو هذا - من بلدي ReportGenerator الطبقة، أنا فقط بحاجة إلى StockMarketData كائن من أجل الوصول إلى متغيرات خصائصه / الأعضاء-ما بعد المعالجة وما بعد الحساب.مما يعني أنه في الحقيقة ، أريد الحصول على الكائن المليء بالبيانات مسبقًا.وهكذا أحتفظ calculateStockMarketData الطريقة خاصة واستدعائها تلقائيًا من ملف StockMarketData البناء.لكنني أشعر بعدم الارتياح إلى حد ما بشأن إجراء كل عمليات المعالجة الخاصة بي في المُنشئ ومن ثم عدم وجود أي طرق عامة.هل هذا عيب في التصميم؟أم أنها حقا الطريقة الأكثر منطقية للقيام بذلك؟في الأساس، أي من التطبيقين التاليين هو الأفضل؟

1) (تنفيذي الحالي) اصنع المركزي calculateStockMarketData() طريقة خاصة ونسميها من StockMarketData منشئ الطريقة (يتجاوز تاريخ اليوم)، بحيث كلما كان لديك StockMarketData الكائن، فهو ممتلئ بالفعل.لذلك كل ما أحتاجه من ReportGenerator الفئة قبل البدء في استخدام خصائص الكائن هي السطر:

StockMarketData myData = new StockMarketData(someDate);

2) اصنع المركزية calculateStockMarketData() الطريقة عامة، بحيث من أجل إعداد StockMarketData الكائن الذي تحتاجه لاستدعاء الطريقة بشكل صريح.لذلك من ReportGenerator الفئة التي أود ترميزها:

StockMarketData myData = new StockMarketData(someDate);
myData.calculateStockMarketData();

الأول يذهلني باعتباره التصميم الأفضل، خاصة أنه لا توجد إمكانية لاستخدام خصائص الكائن قبل تهيئتها.لكنني أيضًا غير متأكد من المعايير المتعلقة بتنفيذ قدر كبير من التعليمات البرمجية من المُنشئ ...أيهما أختار؟

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

المحلول

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

من ناحية أخرى، إذا كنت تعتبر أن الفصل في حالة غير صالحة دون تعبئة البيانات، فيجب عليك القيام بذلك عند الإنشاء.

نصائح أخرى

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

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

أقوم دائمًا بالتحميل بشكل صريح بعد البناء.

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

من الممارسات الجيدة عدم تنفيذ الكثير من التعليمات البرمجية داخل المُنشئ.

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