تصميم المنشئ
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.