متى يجب استخدام فئة Getters الخاصة بها VS الوصول إلى الأعضاء مباشرة؟

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

  •  06-09-2019
  •  | 
  •  

سؤال

عند إنشاء STARTISS و Getters in Eclipse أحد الخيارات هو استخدام Getters و Setters داخل الفصل بدلا من الوصول إلى أعضاء الفصل مباشرة. هل هذا المستوى من التغليف الداخلي للفئة مفيد أم أنه يأخذ فكرة جيدة خطوة واحدة أكثر بكثير؟

مغفل: يجب عليك استخدام خصائص Accessor من داخل الفصل، أو من خارج الفئة مباشرة؟

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

المحلول

أعتقد أنها فكرة جيدة إذا كنت ترغب في حدوث الآثار الجانبية المحتملة - التحقق من الصحة أو التسجيل وما إلى ذلك (في C # أود أن أكون قادرا على إعلان متغير وممتلكات وأقول فقط الوصول إلى المتغير هو من خلال الممتلكات.)

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

نصائح أخرى

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

في رأيي، هذا شيء يجب تعريفه في إرشادات الترميز.

الجواب القصير هو أن يتوقف" :)

اريك ليبيرت لديه مقال ممتاز التلقائي مقابل الخصائص الصريحة يتناول هذه المشكلة، وإن كان من زاوية مختلفة قليلا.

في الأساس، السؤال الذي تحتاجه إلى طرحه هو:

"من داخل الفصل، [هي] الدلالات المرغوبة للوصول إلى هذه العقار ... مختلفة من الدلالات المرغوبة للوصول إلى العقار من الخارج؟"

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

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

بالنسبة للحصول على Getters، يمكنك بدلا من الوصول إلى حقل يحسب قيمة عند تغيير التمثيل.

عندما تحتاج إلى تمديد سلوك Getter / Setter لصف، فمن المفيد أن تكون حقول مغلفة (Getters / Setters بدلا من الوصول إلى الأعضاء المباشر). ومع ذلك، في الميراث، من المثير للاهتمام أن تحافظ على أغلال صفك، إذا كان لا ينبغي أن تكون الفئات الفرعية لها على دراية بأشياءها الخاصة. لذلك، في بعض الأحيان يكون الحقل خاصا لتنفيذ فصل، حتى لا يدرك ذلك الفئات الفرعية ذلك.

أجد أنني أفعل ذلك في بعض الأحيان - على وجه التحديد عندما أحتاج، أو تتوقع بشدة أنني سأطلب أو بعض تسجيل الدخول حول الحصول على أو الإعداد (والتحقق من الصحة من حولهم) من الأعضاء.

أجد أن وجود خصائص خاصة / داخلية تساعد في هذه الحالات.

لكنني بالتأكيد لا أفعل ذلك لأي ميمير.

آخر .NET / VS يساعد حقا هنا كما يمكنك إعلان خاصية على هذا النحو:

public string SomeProperty
{
get;
set;
}

وقد يخلق بشكل فعال المفسي وراء المشهد. أعلم أنه لا يساعدك، لكنني اعتقدت أنه قد يكون من الاهتمام :-)

إذا كنت ترغب في أن يكون هذا العضو لقطة بيانات عن طريق Winform أو WPF، فأنا أعتقد أنك بحاجة إلى إعلانها كخاصية. أنا حوالي 95 في المئة إيجابية أن DataBinding يتطلب عقار (بناء جملة Getter / إعداد). لدي حل صغير WPF يوضح هذا، لكنني لا أرى طريقة لإرفاقه هنا.

إليك الرمز: (بنيت مع VS 2008 SP1، واستهداف .NET 3.5 - استخدمت مشروع WPF). هناك عنصرين في مشروع WPF، والنافذة الرئيسية (Window1)، والكائن الذي نقوم باختباره (DataObject) هناك تسمية في النافذة التي تعد DataBound إلى خاصية الاسم في مثيل كائن البيانات. إذا قمت بتحويل خاصية الاسم إلى حقل (قم بإزالة The Getter / Setter)، فسوف يتوقف DataBinding عن العمل.

window1.xaml:

<Window x:Class="WpfDatabinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <Label Name ="Label1" Height="28" Margin="12,24,37,0" VerticalAlignment="Top" Content="{Binding Name}"></Label>
</Grid>

window1.xaml.cs.

using System;
using System.Windows;

namespace WpfDatabinding
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private DataObject ADataObject;

        public Window1()
        {
            InitializeComponent();
            this.ADataObject = new DataObject();
            this.ADataObject.Name = "Hello!";
            this.DataContext = this.ADataObject;
        }
    }
}

namespace WpfDatabinding
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private DataObject ADataObject;

        public Window1()
        {
            InitializeComponent();
            this.ADataObject = new DataObject();
            this.ADataObject.Name = "Hello!";
            this.DataContext = this.ADataObject;
        }
    }
}

dataibject.cs:

namespace WpfDatabinding
{
    public class DataObject
    {
        // convert this to a field, and databinding will stop working
        public string Name
        {
            get;
            set;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top