مشاركة عبر


تصميم المنشئ

Construcإلىrs هي الأساليب الخاصة باستخدام إلى أنواع تهيئة وإنشاء مثيلات للأنواع. الدالة الإنشائية نوع هو استخدامه ليهيّئ البيانات الثابتة في نوع. الدالة الإنشائية نوع هو تسمى بوقت تشغيل اللغة العامة (CLR) قبل أن يتم تاريخ الإنشاء أية مثيلات من النوع. نوع المنشئات static(Sharedفي Visual أساسى) ويتعذر أخذ معلمات. الدالة الإنشائية مثيل هو المستخدمة لإنشاء مثيلات لنوع. يمكن الحصول على مثيل المنشئات معلمات، ولكن ليس مطلوباً منك القيام بذلك. يطلق الدالة الإنشائية مثيل بدون أي معلمة الافتراضي المنشئ.

توضح الإرشادات العامة التالية أفضل الممارسات لإنشاء المنشئات.

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

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

قم باستخدام معلمات الدالة الإنشائية كـ الاختصارات الخاصة بتعيين الخصائص الأساسية.

تعيين خصائص باستخدام الدالة الإنشائية يجب أن يكون مطابقاً لتعيين الخصائص مباشرة. يلي تعليمات برمجية يظهر مثال EmployeeRecordالفئة التي يمكن أن تتم تهيئة قبل استدعاء الدالة الإنشائية أو بتعيين الخصائص مباشرة. EmployeeManagerConstructorيوضح فئة تهيئة EmployeeRecordالكائن باستخدام الدالة الإنشائية. EmployeeManagerPropertiesيوضح فئة تهيئة EmployeeRecordاستخدام كائن "خصائص". Testerفئة يوضح أن بغض النظر عن تقنية تستخدم، الكائنات أن نفس الولاية.

Imports System
Imports System.Collections.ObjectModel
namespace Examples.DesignGuidelines.Constructors

    ' This Class can get its data either by setting 
    ' properties or by passing the data to its constructor.
    Public Class EmployeeRecord

        private employeeIdValue as Integer
        private departmentValue as Integer

        Public Sub New()
        End Sub

        Public Sub New(id as Integer, department as Integer)
            Me.employeeIdValue = id
            Me.departmentValue = department
        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 Sub DisplayData()
            Console.WriteLine("{0} {1}", EmployeeId, Department)
        End Sub
    End Class

    ' This Class creates Employee records by passing 
    ' argumemnts to the constructor.
    Public Class EmployeeManagerConstructor
        Dim employees as Collection(Of EmployeeRecord) =  _
            new Collection(Of EmployeeRecord)()

        Public Sub AddEmployee(employeeId as Integer, department as Integer)
            Dim record as EmployeeRecord = new EmployeeRecord(employeeId, department)
            employees.Add(record)
            record.DisplayData()
        End Sub
    End Class

    ' This Class creates Employee records by setting properties.
    Public Class EmployeeManagerProperties
        Dim employees as Collection(Of EmployeeRecord)=  _
        new Collection(Of EmployeeRecord)()
        Public Sub AddEmployee(employeeId as Integer, department as Integer)
            Dim record as EmployeeRecord = new EmployeeRecord()
            record.EmployeeId = employeeId
            record.Department = department
            employees.Add(record)
            record.DisplayData()
        End Sub
    End Class

    Public Class Tester
    ' The following method creates objects with the same state
        ' using the two different approaches.
        Public Shared Sub Main()
            Dim byConstructor as EmployeeManagerConstructor = _
                new EmployeeManagerConstructor()
            byConstructor.AddEmployee(102, 102)

            Dim byProperties as EmployeeManagerProperties = _
                new EmployeeManagerProperties()
            byProperties.AddEmployee(102, 102)
        End Sub
    End Class
End Namespace
using System;
using System.Collections.ObjectModel;
namespace Examples.DesignGuidelines.Constructors
{
    // This class can get its data either by setting 
    // properties or by passing the data to its constructor.
    public class EmployeeRecord
    {
        private int employeeId;
        private int department;

        public EmployeeRecord()
        {
        }
        public EmployeeRecord(int id, int department)
        {
            this.employeeId = id;
            this.department = department;
        }
        public int Department
        {
            get {return department;}
            set {department = value;}
        }
        public int EmployeeId
        {
            get {return employeeId;}
            set {employeeId = value;}
        }
        public void DisplayData()
        {
            Console.WriteLine("{0} {1}", EmployeeId, Department);
        }
    }
    // This class creates Employee records by passing 
    // argumemnts to the constructor.
    public class EmployeeManagerConstructor
    {
        Collection<EmployeeRecord > employees = new Collection<EmployeeRecord>();

        public void AddEmployee(int employeeId, int department)
        {
            EmployeeRecord record = new EmployeeRecord(employeeId, department);
            employees.Add(record);
            record.DisplayData();
        }
    }
    // This class creates Employee records by setting properties.
    public class EmployeeManagerProperties
    {
    Collection<EmployeeRecord > employees = new Collection<EmployeeRecord>();
        public void AddEmployee(int employeeId, int department)
        {
            EmployeeRecord record = new EmployeeRecord();
            record.EmployeeId = employeeId;
            record.Department = department;
            employees.Add(record);
            record.DisplayData();
        }
    }
    public class Tester
    {
    // The following method creates objects with the same state
        // using the two different approaches.
        public static void Main()
        {
            EmployeeManagerConstructor byConstructor = 
                new EmployeeManagerConstructor();
            byConstructor.AddEmployee(102, 102);

            EmployeeManagerProperties byProperties = 
                new EmployeeManagerProperties();
            byProperties.AddEmployee(102, 102);
        }
    }
}

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

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

Th هو إرشاد هو هو موضح في المثال السابق.

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

رمى استثناءات من المنشئات مثيلاً إذا كان ذلك مناسباً.

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

قم بوضوح تقوم بتعريف الدالة الإنشائية افتراضي عام في فئات، إذا على الدالة الإنشائية هو المطلوبة.

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

تتجنب المنشئات الافتراضي تشغيل بنيات.

compilers كثيرة، C# المترجم، بما في ذلك عدم دعم بدون معلمات المنشئات تشغيل بنيات.

لا باستدعاء الأعضاء الظاهري تشغيل كائن داخل المنشئات الخاصة به.

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

Imports System

Namespace Examples.DesignGuidelines.MemberDesign
    Public Class BadBaseClass

        Protected  state as String
        Public Sub New()

            state = "BadBaseClass"
            SetState()
        End Sub
        Public Overridable Sub SetState()
        End Sub
    End Class

    Public Class DerivedFromBad 
        Inherits BadBaseClass
        Public Sub New()

            state = "DerivedFromBad "
        End Sub

        Public Overrides Sub SetState()
            Console.WriteLine(state)
        End Sub
    End Class

    Public Class tester

        Public Shared Sub Main()

            Dim b as DerivedFromBad = new DerivedFromBad()
        End Sub
    End Class
End Namespace
using System;

namespace Examples.DesignGuidelines.MemberDesign
{
    public class BadBaseClass
    {
        protected string state;
        public BadBaseClass()
        {
            state = "BadBaseClass";
            SetState();
        }
        public virtual void SetState()
        {

        }
    }

    public class DerivedFromBad : BadBaseClass
    {
        public DerivedFromBad()
        {
            state = "DerivedFromBad ";
        }
        public override void SetState()
        {
            Console.WriteLine(state);
        }

    }
    public class tester
    {
        public static void Main()
        {
            DerivedFromBad b = new DerivedFromBad();
        }
    }
}

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

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

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

راجع أيضًا:

المبادئ

تصميم الدالة الإنشائية النوع

موارد أخرى

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

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