مشاركة عبر


اختيار بين خصائص و أساليب

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

يمكنك استخدام خاصية حالة العضو يمثل سمة منطقية من النوع.

على سبيل المثال، BorderStyleهو خاصية لأن النمط الحد هو سمة ListView.

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

يلي تعليمات برمجية يوضح المثال هذه الإرشادات العامة. EmployeeRecordفئة قم بتعريف خاصيتين توفر الوصول إلى حقول الخاصة. مثال كامل هو تظهر في إنهاء th هو الموضوع.

Public Class EmployeeRecord

    Private employeeIdValue as Integer
    Private departmentValue as Integer

    Public Sub New()
    End Sub

    Public Sub New (id as Integer, departmentId as Integer)
        EmployeeId = id
        Department = departmentId
    End Sub

    Public Property Department as Integer
        Get 
            Return departmentValue
        End Get
        Set 
            departmentValue = value
        End Set
    End Property

    Public Property EmployeeId as Integer
        Get 
            Return employeeIdValue
        End Get
        Set 
            employeeIdValue = value
        End Set
    End Property
    Public Function Clone() as EmployeeRecord
        Return new EmployeeRecord(employeeIdValue, departmentValue)
    End Function
End Class
public class EmployeeRecord
{
    private int employeeId;
    private int department;
    public EmployeeRecord()
    {
    }
    public  EmployeeRecord (int id, int departmentId)
    {
        EmployeeId = id;
        Department = departmentId;
    }
    public int Department
    {
        get {return department;}
        set {department = value;}
    }
    public int EmployeeId
    {
        get {return employeeId;}
        set {employeeId = value;}
    }
    public EmployeeRecord Clone()
    {
        return new EmployeeRecord(employeeId, department);
    }
}

هل استخدم أسلوب، بدلاً من خاصية، في الحالات التالية.

  • تشغيل هو أبطأ من التعيين حقول ستكون الحادث للطلبات. إذا كان المسؤول الذي يتم حتى والاستفسار توفير إصداراً غير متزامنة من عملية لتجنب حظر مؤشر ترابط، فإنه هو الأرجح التي تشغيل هو مكلفة جداً أن تكون خاصية. في معينة، العمليات الوصول إلى الشبكة أو النظام الملفات (غير مرة واحدة في itialization) على الأرجح يجب وظائف، غير خصائص.

  • تشغيل هو تحويل، مثل Object.ToString method.

  • إرجاع تشغيل آخر يتسبب في كل مرة هو يسمى، حتى في حالة عدم تغيير المعلمات. على سبيل المثال، NewGuidإرجاع الأسلوب آخر القيمة كل مرة هو تسمى.

  • تشغيل له تأثير جانبي الهامة و observable. لاحظ أن ملء ذاكرة تخزين مؤقت داخلية هو لا عموما باعتبارها أحد التأثيرات الجانبية observable.

  • العملية إرجاع النسخ من الحالة الداخلية (لا يشمل ذلك النسخ الكائنات نوع القيمة التي تم إرجاعها تشغيل المكدس).

  • تشغيل إرجاع صفيفة.

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

Public Class EmployeeData

    Dim data as EmployeeRecord()
    Public Sub New(data as EmployeeRecord())
        Me.data = data
    End Sub
    Public ReadOnly Property Employees as EmployeeRecord()
        Get
            Dim newData as EmployeeRecord() = CopyEmployeeRecords()
            Return newData
        End Get
    End Property

    Private Function CopyEmployeeRecords() as EmployeeRecord()
        Dim newData(UBound(data)) as EmployeeRecord
        For i as Integer = 0 To UBound(data)
            newData(i) = data(i).Clone()
        Next i
        Console.WriteLine ("EmployeeData: cloned employee data.")
        Return newData
    End Function
End Class
public class EmployeeData
{
    EmployeeRecord[] data;
    public EmployeeData(EmployeeRecord[] data)
    {
        this.data = data;
    }
    public EmployeeRecord[] Employees
    {
        get 
        {
            EmployeeRecord[] newData = CopyEmployeeRecords();
            return newData;
        }
    }
    EmployeeRecord[] CopyEmployeeRecords()
    {
        EmployeeRecord[] newData = new EmployeeRecord[data.Length];
        for(int i = 0; i< data.Length; i++)
        {
            newData[i] = data[i].Clone();
        }
        Console.WriteLine ("EmployeeData: cloned employee data.");
        return newData;
    }
}

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

Public Class RecordChecker
    Public Shared Function  FindEmployees( _
         dataSource as EmployeeData, _
         department as Integer) as Collection(Of Integer)

        Dim storage as Collection(Of Integer) = new Collection(Of Integer)()
        Console.WriteLine("Record checker: beginning search.")
        For i as Integer = 0 To UBound(dataSource.Employees)
            If dataSource.Employees(i).Department = department
                Console.WriteLine("Record checker: found match at {0}.", i)
                storage.Add(dataSource.Employees(i).EmployeeId)
                Console.WriteLine("Record checker: stored match at {0}.", i)
            Else 
                Console.WriteLine("Record checker: no match at {0}.", i)
            End If
        Next i
        Return storage
    End Function
End Class
public class RecordChecker
{
    public static Collection<int> FindEmployees(EmployeeData dataSource, 
             int department)
    {
        Collection<int> storage = new Collection<int>();
        Console.WriteLine("Record checker: beginning search.");
        for (int i = 0; i < dataSource.Employees.Length; i++)
        {
            if (dataSource.Employees[i].Department == department)
            {
                Console.WriteLine("Record checker: found match at {0}.", i);
                storage.Add(dataSource.Employees[i].EmployeeId);
                Console.WriteLine("Record checker: stored match at {0}.", i);
            }
            else 
            {
                Console.WriteLine("Record checker: no match at {0}.", i);
            }
        }
        return storage;
    }
}

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

المثال

يوضح مثال التعليمة البرمجية التالية عبارة عن تطبيق كامل يفترض الوصول إلى خاصية هو مكلفة الممكن. EmployeeDataتعريف فئة غير صحيح لخاصية التي تقوم بإرجاع نسخ من عنصر الصفيف.

Imports System
Imports System.Collections.ObjectModel

Namespace Examples.DesignGuidelines.Properties
    Public Class EmployeeRecord

        Private employeeIdValue as Integer
        Private departmentValue as Integer

        Public Sub New()
        End Sub

        Public Sub New (id as Integer, departmentId as Integer)
            EmployeeId = id
            Department = departmentId
        End Sub

        Public Property Department as Integer
            Get 
                Return departmentValue
            End Get
            Set 
                departmentValue = value
            End Set
        End Property

        Public Property EmployeeId as Integer
            Get 
                Return employeeIdValue
            End Get
            Set 
                employeeIdValue = value
            End Set
        End Property
        Public Function Clone() as EmployeeRecord
            Return new EmployeeRecord(employeeIdValue, departmentValue)
        End Function
    End Class

Public Class EmployeeData

    Dim data as EmployeeRecord()
    Public Sub New(data as EmployeeRecord())
        Me.data = data
    End Sub
    Public ReadOnly Property Employees as EmployeeRecord()
        Get
            Dim newData as EmployeeRecord() = CopyEmployeeRecords()
            Return newData
        End Get
    End Property

    Private Function CopyEmployeeRecords() as EmployeeRecord()
        Dim newData(UBound(data)) as EmployeeRecord
        For i as Integer = 0 To UBound(data)
            newData(i) = data(i).Clone()
        Next i
        Console.WriteLine ("EmployeeData: cloned employee data.")
        Return newData
    End Function
End Class

Public Class RecordChecker
    Public Shared Function  FindEmployees( _
         dataSource as EmployeeData, _
         department as Integer) as Collection(Of Integer)

        Dim storage as Collection(Of Integer) = new Collection(Of Integer)()
        Console.WriteLine("Record checker: beginning search.")
        For i as Integer = 0 To UBound(dataSource.Employees)
            If dataSource.Employees(i).Department = department
                Console.WriteLine("Record checker: found match at {0}.", i)
                storage.Add(dataSource.Employees(i).EmployeeId)
                Console.WriteLine("Record checker: stored match at {0}.", i)
            Else 
                Console.WriteLine("Record checker: no match at {0}.", i)
            End If
        Next i
        Return storage
    End Function
End Class
    Public Class Tester
        Public Shared Sub Main()
            Dim records(2) as EmployeeRecord
            Dim r0 as EmployeeRecord = new EmployeeRecord()
            r0.EmployeeId = 1
            r0.Department = 100
            records(0) = r0
            Dim r1 as EmployeeRecord = new EmployeeRecord()
            r1.EmployeeId = 2
            r1.Department = 100
            records(1) = r1
            Dim r2 as EmployeeRecord = new EmployeeRecord()
            r2.EmployeeId = 3
            r2.Department = 101
            records(2) = r2
            Dim empData as EmployeeData = new EmployeeData(records)
            Dim hits as Collection(Of Integer)= _ 
                RecordChecker.FindEmployees(empData, 100)
            For Each i as Integer In hits
                Console.WriteLine("found employee {0}", i)
            Next i
        End Sub
    End Class
End Namespace
using System;
using System.Collections.ObjectModel;
namespace Examples.DesignGuidelines.Properties
{
    public class EmployeeRecord
    {
        private int employeeId;
        private int department;
        public EmployeeRecord()
        {
        }
        public  EmployeeRecord (int id, int departmentId)
        {
            EmployeeId = id;
            Department = departmentId;
        }
        public int Department
        {
            get {return department;}
            set {department = value;}
        }
        public int EmployeeId
        {
            get {return employeeId;}
            set {employeeId = value;}
        }
        public EmployeeRecord Clone()
        {
            return new EmployeeRecord(employeeId, department);
        }
    }

public class EmployeeData
{
    EmployeeRecord[] data;
    public EmployeeData(EmployeeRecord[] data)
    {
        this.data = data;
    }
    public EmployeeRecord[] Employees
    {
        get 
        {
            EmployeeRecord[] newData = CopyEmployeeRecords();
            return newData;
        }
    }
    EmployeeRecord[] CopyEmployeeRecords()
    {
        EmployeeRecord[] newData = new EmployeeRecord[data.Length];
        for(int i = 0; i< data.Length; i++)
        {
            newData[i] = data[i].Clone();
        }
        Console.WriteLine ("EmployeeData: cloned employee data.");
        return newData;
    }
}

public class RecordChecker
{
    public static Collection<int> FindEmployees(EmployeeData dataSource, 
             int department)
    {
        Collection<int> storage = new Collection<int>();
        Console.WriteLine("Record checker: beginning search.");
        for (int i = 0; i < dataSource.Employees.Length; i++)
        {
            if (dataSource.Employees[i].Department == department)
            {
                Console.WriteLine("Record checker: found match at {0}.", i);
                storage.Add(dataSource.Employees[i].EmployeeId);
                Console.WriteLine("Record checker: stored match at {0}.", i);
            }
            else 
            {
                Console.WriteLine("Record checker: no match at {0}.", i);
            }
        }
        return storage;
    }
}
    public class Tester
    {
        public static void Main()
        {
            EmployeeRecord[] records  = new EmployeeRecord[3];
            EmployeeRecord r0  = new EmployeeRecord();
            r0.EmployeeId = 1;
            r0.Department = 100;
            records[0] = r0;
            EmployeeRecord r1  = new EmployeeRecord();
            r1.EmployeeId = 2;
            r1.Department = 100;
            records[1] = r1;
            EmployeeRecord r2  = new EmployeeRecord();
            r2.EmployeeId = 3;
            r2.Department = 101;
            records[2] = r2;
            EmployeeData empData = new EmployeeData(records);
            Collection<int> hits = RecordChecker.FindEmployees(empData, 100);
            foreach (int i in hits)
            {
                Console.WriteLine("found employee {0}", i);
            }
        }
    }
}

أجزاء حقوق النشر 2005 Microsoft Office 2010 Suite Corporation. كافة الحقوق محفوظة.

أجزاء حقوق النشر شركة Addison-Wesley. كافة الحقوق محفوظة.

ل المزيد المعلومات تشغيل إرشادات التصميم، راجع "إطار عمل إرشادات التصميم: كتاب اصطلاحات، Idioms، و نقش لمكتبات.NET القابل لإعادة الاستخدام"ب Krzysztof Cwalina و رفيق Abrams، ينشره Addison-Wesley، 2005.

راجع أيضًا:

المبادئ

تصميم خاصية

موارد أخرى

إرشادات تصميم عضو

تصميم إرشادات لتطوير مكتبات فئة