سؤال

لقد بدأت مؤخرًا العمل في Java وتعرفت على العالم الجامح والمجنون الذي يضم المتسابقين والمستوطنين في كل شيء.لقد كرهته في البداية، لكن سرعان ما اعتدت عليه.معتاد على ذلك.

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

فيما يلي مثال بسيط باستخدام الخصائص العامة.

class Space {
    public String name;
    public String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
}

فيما يلي مثال بسيط باستخدام الخصائص الخاصة واستخدام الحروف والمستوطنين.

class Space {
    private String name;
    private String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    public String getDescription() {
        return this.description;
    }
    public void setDescription(final String description) {
        this.description = description;
    }
}

في هذه الأمثلة، كل من name و ال description يجب أن تكون الحقول قابلة للتغيير.

أشعر أن مثال getter/setter أكثر وضوحًا ويخفي تفاصيل تنفيذ ما name و description نكون.سيسمح أيضًا بالتحقق من صحة المجموعة لاحقًا إذا لزم الأمر.

لقد قرأت العديد من المناقشات حول كون الحروف المحرفة والمستوطنة شريرة و/أو معادية للنمط، ولكن يبدو حقًا أن هذه قد لا تنطبق على هذا الموقف.

ربما هناك بعض الخيارات التي لم أفكر فيها بعد.أنا منفتح على الاقتراحات!

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

المحلول

بكل بساطة:

  • أنت بحاجة إلى حروف لجميع الحقول التي يجب قراءتها من الخارج.
  • أنت بحاجة إلى أدوات ضبط لجميع الحقول التي يجب كتابتها من الخارج.

يمكن أن تكون هذه النسبة 100%، لكنها أقل في أغلب الأحيان.

نصائح أخرى

الإصدار الأول (الملكية العامة) ليس فكرة جيدة.والثاني أفضل.كما يقول جوش بلوخ، "تفضيل الثبات":

public class Space {
    private final String name;
    private final String description;

    public Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

ما قيل، تميل الحروف والمستوطنون إلى الإفراط في الاستخدام.

ولقد سمعت في كثير من الأحيان التبسيط "الحصول على / اضعي شريرة". لا يوجد (آمل) <م> حقا يعني أن هناك أي شيء خطأ في ذلك للكائنات البيانات. أعتقد أن الفكرة الحقيقية هي:

و"حاصل / المحددات شريرة، إلا للكائنات تخزين البيانات واضحة" والتي هي نفسها مجرد التبشير الملائكي من "اقول لا تسأل".

ومثاليا إذا كان فئة لديها حاصل على واضعي، وهذا هو جميع كان ينبغي أن يكون.

وهذا هو حجة على أي حال. أنا لست متأكدا من أنني أتفق مع ذلك.

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

class Space {
    public String Name { get; set; }
    public String Description { get; set; }
    Space(final String name, final String description) {
        this.Name = name;
        this.Description = description;
    }
}

وأشكال بديلة قد تضيف محددات الوصول و / أو الرمز:

private String _name;
public String Name {
    get { if (_name == null) FetchName(); return _name; }
    private set { _name = value; }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top