سؤال

وأنا الترميز حاليا بسيطة طبقة الوصول إلى البيانات، وأنا أتساءل أي نوع أود أن فضح إلى الطبقات الأخرى.

وانا ذاهب الى داخليا تنفيذ البيانات باعتبارها قائمة <>، ولكن أذكر أني قرأت شيئا عن عدم تعريض نوع قائمة للمستهلكين إن لم يكن هناك حاجة.

public List<User> GetAllUsers() // non C# users: that means List of User :)

هل تعرف لماذا (جوجل لم مساعدة)؟ ماذا عادة فضح لهذا النوع من الاشياء؟ الأول قائمة؟ IEnumerable؟

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

المحلول

وعادة أنه من الأفضل لفضح أقل اجهة القوية التي يمكن للمستخدم لا تزال تعمل هادف مع. إذا كان المستخدم يحتاج فقط بعض البيانات enumerable، والعودة IEnumerable<User>. إذا كان هذا لا يكفي لأن المستخدم يجب أن يكون قادرا على تعديل قائمة (انتباه! لا ينبغي أن يكون في كثير من الحالات)، إرجاع IList<User>.

/ تحرير:

وجويل يسأل سؤال صحيح في تعليقه: لماذا الواقع فضح أقل اجهة قوية بدلا من منح أقصى قدر من السلطة المستخدم؟ (اقتبس)

والفكرة وراء ذلك هو أن طريقة إرجاع البيانات قد لا يتوقع المستخدم لتعديل مضمونه: طريقة أخرى من فئة قد لا يزال يتوقع القائمة لتكون غير فارغة بعد أن تم إرجاع إشارة إلى ذلك. تخيل المستخدم يزيل كافة البيانات من القائمة. طريقة أخرى لديها الآن لجعل الاختيار إضافية أن ايلى قد تكون غير ضرورية.

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

وكمثال على ذلك، تخيل أن التنفيذ الفعال يستخدم قاموس وفقط إرجاع جمع Values التي لا تنفذ IList.

نصائح أخرى

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

ويجب عليك التفكير بعناية قبل أن تعود IEnumerable. إذا كان رمز الأساسي يستخدم "العائد" لتوليد IEnumerable، أو يستخدم LINQ، ثم عليك أن ينتهي عقد فتح أي الموارد المستخدمة.

يجب نسخ IEnumerable إلى IEnumerable آخر قبل إعادته. باستخدام IList، وجعل لكم هذا الشرط، بحيث لا أحد يستطيع أن يعود عن غير قصد IEnumerable.

من ناحية أخرى، والعودة إلى IList يعني أن المتصل يتمكنوا من تغيير قائمة إرجاعها.

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