Bir sınıfta yapıcıyı özel yapmanın faydası nedir?


134

Neden kurucuyu sınıfta özel yapmalıyız? Her zaman kurucunun halka açık olması gerekir.

Yanıtlar:


129

Özel kurucuya ihtiyaç duyabileceğiniz bazı nedenler:

  1. Yapıcıya yalnızca sınıfın içindeki statik fabrika yönteminden erişilebilir . Singleton da bu kategoriye ait olabilir.
  2. Yalnızca statik yöntemler içeren bir yardımcı program sınıfı .

9
Ben bir yardımcı sınıf için özel bir kurucu oluşturmak bile rahatsız olmaz.
Petesh

16
@Patesh: Bu senin kararın. Diğer (ler) ve ben, bir hat özel kurucuyu dışarıda bırakmaktan ziyade bir faydalı sınıf örneğini önlemeyi tercih ederiz.
nanda

1
bazı programlama dillerinde (özellikle Java) kalıtımı da önler
dfa

9
@ dfa: kalıtımdan kaçınmak finaliçin sınıf seviyesinde olmalısınız . Özel yapıcı koymak bu nedenle neredeyse işe yaramaz.
nanda

3
@Will: Yansıtma kullanıyorsanız hayır. Özel olarak yapıcıları bildirmek, somutlaştırmayı (yansımayı engelleme) önlemeye yöneliktir, ancak alt sınıflandırmayı önlemek, amaç değil, bir yan etkidir. Bunun için uygun araç sınıfı bildirmektir final. Sun'ın String sınıfı için yaptığı ve genişletilmemesi gereken API'nin makul bir bölümü budur.
BobMcGee

96

Özel bir kurucu sağlayarak, sınıf örneklerinin bu sınıf dışında herhangi bir yerde oluşturulmasını önlersiniz. Bu yapıcıyı sağlamak için birkaç kullanım durumu vardır.

A. Sınıf örnekleriniz bir staticyöntemde oluşturulur . staticDaha sonra, yöntem olarak bildirilir public.

class MyClass()
{
private:
  MyClass() { }

public:
  static MyClass * CreateInstance() { return new MyClass(); }
};

B. Sınıfınız bir singleton . Bu, programda sınıfınızın birden fazla örneğinin bulunmadığı anlamına gelir.

class MyClass()
{
private:
  MyClass() { }

public:
  MyClass & Instance()
  {
    static MyClass * aGlobalInst = new MyClass();
    return *aGlobalInst;
  }
};

C. (Yalnızca yaklaşan C ++ 0x standardı için geçerlidir) Birkaç kurucunuz var. Bazıları ilan edildi public, diğerleri private. Kod boyutunu küçültmek için, kamu kurucuları özel kurucuları çağırır ve bu da tüm işleri yapar. Bu publicnedenle kurucularınıza temsilci kurucular denir :

class MyClass
{
public:
  MyClass() : MyClass(2010, 1, 1) { }

private:
  MyClass(int theYear, int theMonth, int theDay) { /* do real work */ }
};

D. Nesne kopyalamayı sınırlamak istiyorsunuz (örneğin, paylaşılan bir kaynak kullandığından):

class MyClass
{
  SharedResource * myResource;

private:
  MyClass(const MyClass & theOriginal) { }
};

E. Sınıfınız bir yardımcı sınıftır . Bu sadece staticüyeler içerdiği anlamına gelir . Bu durumda, programda hiçbir nesne örneği oluşturulmamalıdır.


3
Çoğu durumda, nesne kopyalamayı önlemek istersiniz. Bu nedenle, özel kopya oluşturucu için bir uygulama sağlamazsınız.
frast

google c ++ stil kılavuzundan (listede olmayan ancak ortak bir başka örnek) -> yapıcıda "bir fabrika işlevini düşünün [ve yapıcıyı özel hale getirin]" yapmanız gerekiyorsa (kare parantez içindeki metin benim tarafımdan yazılır )
Trevor Boyd Smith

12

Başka bir arkadaş sınıfının / fonksiyonunun bir nesneyi kullanıcının yasakladığı şekilde inşa etmesini sağlayan bir "arka kapı" bırakmak. Akla gelen bir örnek, bir yineleyici (C ++) oluşturan bir kap olabilir:

Iterator Container::begin() { return Iterator(this->beginPtr_); }
// Iterator(pointer_type p) constructor is private,
//     and Container is a friend of Iterator.

Bu yeterince farklı mı, Terry? ;)
Emile Cormier

İyi cevap. Neden yansımadan bahsetmiyoruz, çünkü bu kullanıcının yapamayacağı bir şeyi başarmanın bir yolu
BobMcGee

@Bob: Ben esas olarak bir C ++ adam ve yansıma gerçekten C ++ kelime değil gibi, bu konuda beni aydınlatmak zorunda kalacak. ;)
Emile Cormier

3
Kimse bunu okuyamayacak, ama işte gidiyor: Bu konuda birkaç kez reddedildim. Üzgün ​​ya da başka bir şey değil, (öğrenme uğruna) bunun neden kötü olduğunu bilmek isterim? Bir kabın verilerine erişmek için ihtiyaç duyduğu verilerle başka bir yineleyici nasıl oluşturulabilir?
Emile Cormier

2
@EmileCormier, bence haksız yere aşağı oy aldınız çünkü C ++ öğrenen insanlara tekrar tekrar söylendi: "Arkadaş beyanlarından kaçının". Bu öneri, aksi takdirde friendgaranti edilmediği yerlerde kullanabilen deneyimsiz C ++ programcılarını hedefliyor gibi görünüyor ve bunun kötü bir fikir olduğu birçok durum var. Ne yazık ki, mesaj çok iyi karşılandı ve birçok geliştirici dili asla ara sıra kullanımının friendsadece kabul edilebilir değil, aynı zamanda tercih edilebilir olduğunu anlayacak kadar iyi öğrenmiyor . Örneğin sadece böyle bir durumdu. Kasıtlı güçlü bağlantı bir suç değildir, bir tasarım kararıdır.
16'da evadeflow

10

Herkes Singleton'a takıldı, vay canına.

Diğer şeyler:

  • İnsanların sınıfınızda yığın oluşturmasını engelleyin; özel yapıcılar yapabilir ve fabrika yöntemiyle yalnızca işaretçileri geri verebilir.
  • Sınıfın kopyalarını oluşturmayı önleme (özel kopya oluşturucu)

8

Bu, ortak kod içeren bir kurucu için çok yararlı olabilir; özel kurucular 'this (...);' kullanarak diğer kurucular tarafından çağrılabilir. notasyonu. Özel (veya korumalı) bir kurucuda ortak başlatma kodunu yaparak, yalnızca inşaat sırasında çağrıldığını açıkça açıkça belirtiyorsunuz, bu sadece bir yöntem olsaydı değil:

public class Point {
   public Point() {
     this(0,0); // call common constructor
   }
   private Point(int x,int y) {
     m_x = x; m_y = y;
   }
};

3

Genel bir kurucu kullanmak istemeyebileceğiniz bazı durumlar vardır; örneğin tek bir sınıf istiyorsanız.

3. taraflarca kullanılan bir derleme yazıyorsanız, yalnızca derlemeniz tarafından oluşturulmasını istediğiniz ve derlemenizin kullanıcıları tarafından başlatılmasını istemediğiniz birkaç dahili sınıf olabilir.


3

Bu, sizin (özel yapıcılı sınıf) yapıcıyı nasıl çağırdığınızı kontrol etmenizi sağlar.

Bir örnek: Sınıftaki statik fabrika yöntemi, fabrika yöntemi bunları ayırmayı seçtikçe nesneleri döndürebilir (örneğin, tek bir fabrika gibi).


@Skilldrick: Bir örnek, bir sınıfı yalnızca öbek ayırmaya zorlayabilmenizdir.
Dirk

@dirk Yorumum artık alakalı olmadığından sildim.
Skilldrick

3

Nesnenin yalnızca belirli bir sınıf tarafından oluşturulmasını önlemek için özel yapıcıya da sahip olabiliriz (Güvenlik nedeniyle).

Bunu yapmanın bir yolu bir arkadaş sınıfına sahip olmaktır.

C ++ örneği:

class ClientClass;
class SecureClass 
{
  private:
    SecureClass();   // Constructor is private.
    friend class ClientClass;  // All methods in 
                               //ClientClass have access to private
                               // &   protected methods of SecureClass.
};

class ClientClass
{
public:
    ClientClass();
    SecureClass* CreateSecureClass()
     { 
           return (new SecureClass());  // we can access 
                                        // constructor of 
                                        // SecureClass as 
                                        // ClientClass is friend 
                                        // of SecureClass.
     }
};

Not: Not: Yalnızca ClientClass (SecureClass'ın arkadaşı olduğu için) SecureClass'ın Yapıcısını çağırabilir.



2

kullanıcıların bu sınıfın örneklerini oluşturmasını veya bu sınıfı devralan sınıfı oluşturmasını istemediğinizde java.lang.math, bu paketteki statictüm işlevler gibi, tüm işlevler bir örnek oluşturmadan çağrılabilir math, böylece kurucu statik olarak duyurulur .


1

Eğer özelse, ==> diyemezsiniz, sınıfı başlatamazsınız. Bir singleton gibi bazı durumlarda kullanışlıdır.

Burada bir tartışma ve birkaç örnek daha var .


1

Sizden de aynı sorunu ele alan bir soru gördüm.

Diğerlerinin örnek oluşturmasına izin vermek istemiyorsanız, yapıyı sınırlı bir kapsamda tutun. Pratik uygulama (Bir örnek) singleton örüntüsüdür.


1

Sen olmamalıdır yapıcı özel hale gelir. Dönemi. Korumalı hale getirin, böylece gerekirse sınıfı genişletebilirsiniz.

Edit: Ben bunun yanında, ne kadar downvotes bu atmak olursa olsun. Kod üzerinde gelecekteki geliştirme potansiyelini ortadan kaldırıyorsunuz. Diğer kullanıcılar veya programcılar sınıfı genişletmeye gerçekten kararlıysa, yapıcıyı kaynakta veya bayt kodunda korumalı olarak değiştirir. Hayatlarını biraz daha zorlaştırmanın dışında hiçbir şey başaramayacaksınız. Yapımcınızın yorumlarına bir uyarı ekleyin ve bunu ona bırakın.

Eğer bir yardımcı sınıf ise, daha basit, daha doğru ve daha zarif bir çözüm, uzatmayı önlemek için tüm sınıfı "statik final" olarak işaretlemektir. Sadece yapıcıyı özel olarak işaretlemek iyi olmaz; gerçekten kararlı bir kullanıcı yapıcıyı elde etmek için her zaman yansımayı kullanabilir.

Geçerli kullanımlar:

  • Bir kurucunun iyi bir kullanımı, protected örneklemeyi sınırlamanıza veya pahalı kaynakları (DB bağlantıları, yerel kaynaklar) yeniden kullanmanıza izin veren statik fabrika yöntemlerini kullanmaya zorlamaktır.
  • Singletons (genellikle iyi bir uygulama değildir, ancak bazen gereklidir)

2
Deneyimlerime göre, mutlak gerçekler yoktur, durum isterse goto bile kullanılabilir. Kötü ve Kötülük yolları vardır, ancak Marshall Cline'ın dediği gibi, bazen daha az kötülük arasında seçim yapmanız gerekir. parashift.com/c++-faq-lite/big-picture.html#faq-6.15 Özel yapımcılara gelince, onlar sizin için gerekli ve hatta kötü değil. Bu sadece alt sınıflarınız dahil hiç kimsenin kullanmaması gerektiği anlamına gelir.
daramarak

Gotoların yeri var, doğru, ama bir yapıcıyı özel olarak işaretlemek size yoldan rahatsız olmaktan başka bir şey kazandırmaz. Nedenimi daha ayrıntılı bir şekilde açıklamak için görevimi düzenledim.
10:10

Bazı sınıfları yapı veya varsayılan yapı kopyalamak mantıklı değildir . C ++ 'da bunu özel bir ctor'u tanımlamadan bildirerek belirtirsiniz (operatör = için de yaygındır).

Java JIT ve GWT gibi derleyicileri optimize etmek aslında özel kuruculardan yararlanır: örnekleme kapsamını sınırlamak ve kodunuzu satır içine almak / budamak için daha iyi bir iş yapmak.
Ajax

1

Yapıcı, singleton uygulamanız veya bir sınıfın nesne sayısını sınırlamanız gerektiği gibi bir amaçla özeldir. Örneğin singleton uygulamasında yapıcıyı özel yapmalıyız

#include<iostream>
using namespace std;
class singletonClass
{


    static int i;
    static singletonClass* instance;
public:


    static singletonClass* createInstance()
    {


        if(i==0)
        {

            instance =new singletonClass;
            i=1;

        }

        return instance;

    }
    void test()
    {

        cout<<"successfully created instance";
    }
};

int singletonClass::i=0;
singletonClass* singletonClass::instance=NULL;
int main()
{


    singletonClass *temp=singletonClass::createInstance();//////return instance!!!
    temp->test();
}

Nesne oluşturma işlemini 10 ile sınırlamak istiyorsanız, aşağıdakileri kullanın

#include<iostream>
using namespace std;
class singletonClass
{


    static int i;
    static singletonClass* instance;
public:


    static singletonClass* createInstance()
    {


        if(i<10)
        {

            instance =new singletonClass;
            i++;
            cout<<"created";

        }

        return instance;

    }
};

int singletonClass::i=0;
singletonClass* singletonClass::instance=NULL;
int main()
{


    singletonClass *temp=singletonClass::createInstance();//return an instance
    singletonClass *temp1=singletonClass::createInstance();///return another instance

}

Teşekkürler


1

Birden fazla kurucunuz olabilir. Açık bir şekilde sağlamazsanız, C ++ varsayılan bir kurucu ve varsayılan bir kopya kurucu sağlar. Yalnızca bazı parametreli kurucular kullanılarak oluşturulabilecek bir sınıfınız olduğunu varsayalım. Belki değişkenleri başlattı. Bir kullanıcı bu sınıfı bu kurucu olmadan kullanırsa, sorunların sonu gelmez. İyi bir genel kural: Varsayılan uygulama geçerli değilse, hem varsayılan hem de kopya yapıcısını özel yapın ve bir uygulama sağlayın:

class C
{
public:
    C(int x);

private:
    C();
    C(const C &);
};

Kullanıcıların nesneyi geçerli olmayan varsayılan kurucularla kullanmasını önlemek için derleyiciyi kullanın.


2
Varsayılan bir kurucu belirtmeden varsayılan olmayan bir kurucu sağlarsanız, varsayılan kurucu yoktur. Oluşturmaya ve özel yapmaya gerek yok.
TT_

0

Etkili Java'dan alıntı yaparak , sabitleri (statik son alanlar olarak) tanımlayan bir yardımcı program sınıfına sahip olmak için özel yapıcıya sahip bir sınıfınız olabilir.

( DÜZENLEME: Yoruma göre bu sadece Java ile uygulanabilecek bir şeydir, bu yapının diğer OO dillerinde uygulanabilir / gerekli olup olmadığını bilmiyorum (C ++ diyelim))

Aşağıdaki gibi bir örnek:

public class Constants {
    private Contants():

    public static final int ADDRESS_UNIT = 32;
    ...
}

EDIT_1 : Yine, aşağıdaki açıklama Java için geçerlidir: (ve Etkili Java kitabından bahsederek )

Zararlı olmasa da, aşağıdaki gibi bir faydalı sınıf örneğinin oluşturulması, herhangi bir amaca hizmet etmediği için herhangi bir amaca hizmet etmez.

Örneğin, sınıf Sabitleri için özel bir Oluşturucu olmadığını varsayalım. Aşağıdaki gibi bir kod parçası geçerlidir, ancak Constants sınıfı kullanıcısının niyetini daha iyi iletmez

unit = (this.length)/new Constants().ADDRESS_UNIT;

kodun aksine

unit = (this.length)/Constants.ADDRESS_UNIT;

Ayrıca özel bir kurucu, Sabitler (diyelim) sınıfının tasarımcısının niyetini daha iyi ilettiğini düşünüyorum .

Herhangi bir kurucu sağlanmadıysa ve amacınız somutlaştırmayı önlemekse, Java varsayılan bir parametresiz genel kurucu sağlar.

Üst düzey bir sınıf statik işaretlenemez ve son sınıf bile örneklenebilir.


2
Ancak C ++ 'da bunun için bir sınıfa ihtiyacınız yoktur. Bir şey nesnenin içindeki verilere bağlı değilse, onu serbest işlevler ve serbest değişkenler olarak yazın. Kapsülleme ister misiniz? Bir ad alanı kullanın.
daramarak

@daramarak: teşekkürler, C ++ ile hiçbir deneyimim yok. Cevabı sadece Java
sateesh

2
Nesneniz sadece statik değişkenleri kapsülliyorsa, neden örnekleme sınırlandırılmalıdır? Neden kurucu hakkında bir şey belirtmelisiniz? Eğer somutlaştırılırsa zarar vermez. Sınıfı statik ve final ilan eden benzer sonuçlar elde edebileceğiniz anlaşılıyor.
BobMcGee

@BobMcGee, yorumunuz için teşekkürler. Bu, benim yayınladıklarım hakkında daha fazla düşünmemi (ve göndermemizi) sağladı. Cevabımı, özel kurucunun yararlılığı hakkında biraz daha mantık eklemek için düzenledim.
Sateesh

0

Fayda sınıflarının özel kurucuları olabilir. Sınıf kullanıcıları bu sınıfları başlatamaz:

public final class UtilityClass {
    private UtilityClass() {}

    public static utilityMethod1() {
        ...
    }
}

1
Fayda sınıfının somutlaştırılması neden önemlidir? Tek yaptığı, alanı olmayan bir nesne oluşturmak ve birkaç bayt bellek yemek.
BobMcGee

Bunu başlatabilmek belirsiz bir API oluşturur. Bir sınıfı, durumu olmayan bir yardımcı sınıf olarak tasarlar ve bu şekilde tutmak isterseniz. Bir sınıfı genel bir kurucu ile alt sınıflandırabilirsiniz. Bazı yardımcı yöntemlerin bir alt sınıfı idiyotiktir.
gpampara

@BobMcGee: Açıkçası çalışan bir sınıf tasarlamak ve başkaları tarafından kullanılacak bir sınıf tasarlamak farklı şeylerdir. API geliştirmede çalışanlar (Sun çalışanları veya Google koleksiyonları adamı gibi), bir yardımcı program sınıfındaki özel kurucunun işe yaramaz olduğunu söylemeye çalışan herkesi öldürecek.
nanda

@gpampara: Sınıfınızın finalini ilan etmek insanların alt sınıflanmasını önler. Sun'ın String sınıfı için yaptığı şey budur. @Nanda: Bir yardımcı sınıfın tanımlanmış bir kurucuya ihtiyacı yoktur . Genişletilebilir olmasını istemiyorsanız, "final" kullanarak olmadığını belirtin.
BobMcGee

1
@BobMcGee: Sun'ın örneğini görmek ister gibisin. Ardından Sun'ın şu faydalı sınıf Koleksiyonlarına bakın: docjar.com/html/api/java/util/Collections.java.html . Gerçekten de özel kurucu kullanıyor.
nanda

0

Bir sınıfın serbestçe başlatılmasını önlemek isteyebilirsiniz. Örnek olarak singleton tasarım modeline bakın. Benzersizliği garanti etmek için, kimsenin bunun bir örneğini oluşturmasına izin veremezsiniz :-)


0

Önemli kullanımlardan biri SingleTon sınıfında

class Person
{
   private Person()
   {
      //Its private, Hense cannot be Instantiated
   }

   public static Person GetInstance()
   {
       //return new instance of Person
       // In here I will be able to access private constructor
   }
};

Sınıfınız sadece statik yöntemlere sahipse de uygundur. yani kimsenin sınıfınızı başlatmasına gerek yok


Singleton'un birçok kişi tarafından "anti-desen" olarak kabul edildiğine ve bunu uygulama kararının hafifçe yapılmaması gerektiğine dikkat edilmelidir. Yaygın bir alternatif bağımlılık enjeksiyonudur.
Michael Aaron Safyan

SingleTon bir anti-desen değildir. ancak, desenin aşırı kullanımı (kullanımıyla ilgili bilgi eksikliği nedeniyle) iyi değildir. GOF modelinden biri olduğuna dikkat edilmelidir.
SysAdmin

0

Bu gerçekten bariz bir neden: bir nesne oluşturmak istiyorsunuz, ancak bunu yapıcı içinde (arayüz açısından) yapmak pratik değil.

FactoryÖrnek oldukça açıktır, beni göstermek izin Named Constructordeyim.

Diyelim ki Complexkarmaşık bir sayıyı temsil edebilecek bir sınıfım var .

class Complex { public: Complex(double,double); .... };

Soru şudur: Kurucu gerçek ve hayali parçaları mı bekliyor, yoksa norm ve açıyı mı (kutupsal koordinatlar) bekliyor?

Arayüzü daha kolay hale getirmek için değiştirebilirim:

class Complex
{
public:
  static Complex Regular(double, double = 0.0f);
  static Complex Polar(double, double = 0.0f);
private:
  Complex(double, double);
}; // class Complex

Buna Named Constructordeyim denir : sınıf yalnızca hangi kurucuyu kullanmak istediğimizi açıkça belirterek sıfırdan oluşturulabilir.

Birçok inşaat yönteminin özel bir durumudur. Tasarım Desenleri inşa nesnesine yollardan iyi bir numarası: Builder, Factory, Abstract Factory, ... ve özel bir yapıcı kullanıcı düzgün kısıtlanır sağlayacaktır.


0

Daha iyi bilinen kullanımlara ek olarak…

Ben şöyle özetlemek istiyorum Yöntem Nesne desenini uygulamak için :

“Özel kurucu, genel statik yöntem”
“Uygulama nesnesi, arayüz işlevi”

Nesneyi kullanarak bir işlev uygulamak istiyorsanız ve nesne bir kerelik bir hesaplama (yöntem çağrısı ile) yapmanın dışında kullanışlı değilse, bir Throwaway Nesneniz vardır . Nesne oluşturma ve yöntem çağrısını statik bir yöntemle kuşatabilir ve bu yaygın anti-paterni önleyebilirsiniz:

z = new A(x,y).call();

… Yerine (ad boşluklu) işlev çağrısı konulması:

z = A.f(x,y);

Arayanın asla bir nesneyi dahili olarak kullandığınızı, daha temiz bir arayüz sağladığını ve nesnenin etrafında asılı kalmasını veya nesnenin yanlış kullanımını önlediğini bilmesine ya da önemsemesine gerek yoktur.

Örneğin, yöntemlerin genelinde bir hesaplama kırmak istiyorsanız foo, barve zorkve işlevleri dışında, bunu uygulamak olabilir aşağıdaki gibi birçok değerler geçirmek zorunda kalmadan hisse durumuna örneğin:

class A {
  public static Z f(x, y) {
    A a = new A(x, y);
    a.foo();
    a.bar();
    return a.zork();
  }

  private A(X x, Y y) { /* ... */ };
}

Bu Yöntem Nesne kalıbı, Smalltalk Best Practice Patterns (Kent Beck, Kent Beck, sayfa 34–37) 'de verilmiştir;

  1. Orijinal yöntemi, yeni yöntemin bir örneğini oluşturan, özgün yöntemin parametreleri ve alıcısıyla oluşturulmuş ve "compute" işlevini çağıran bir yöntemle değiştirin.

Bu, buradaki diğer örneklerden önemli ölçüde farklıdır: sınıf somutlaştırılabilir (bir yardımcı sınıftan farklı olarak), ancak örnekler özeldir (tektonlar dahil fabrika yöntemlerinin aksine) ve asla kaçmadıkları için yığın üzerinde yaşayabilirler.

Bu model, nesnelerin düşük düzeyli uygulamayı basitleştirmek için kullanıldığı, ancak harici olarak açıkta bırakılmadığı alt dipteki OOP'de çok yararlıdır ve genellikle sunulan ve yüksek seviye arayüzlerle başlayan yukarıdan aşağı OOP ile tezat oluşturur.


0

Bir nesnenin örneklerinin nasıl ve ne zaman (ve kaç tane) oluşturulacağını kontrol etmek istiyorsanız bazen yararlı olabilir.

Diğerleri arasında, desenlerde kullanılır:

Singleton pattern
Builder pattern

Özel bir kurucu değişmez bir nesnede nasıl faydalıdır? Değişmezlik, yaratımdan sonra bir nesnede yapılan değişikliklerin önlenmesiyle , özel kurucular ise yaratımın önlenmesiyle ilgilidir .
Nils von Barth

0

Özel kurucuların kullanımı da alan güdümlü tasarım karşısında okunabilirliği / sürdürülebilirliği artırmak olabilir. "Microsoft .NET - Kurumsal Mimari Uygulamaları, 2. Baskı":

var request = new OrderRequest(1234);

Alıntı, "Burada iki sorun var. Birincisi, koda bakarken, neler olup bittiğini tahmin etmek zor. OrderRequest örneği yaratılıyor, ama neden ve hangi verileri kullanıyor? 1234 nedir? Bu ikinci soruna yol açar: Sınırlı bağlamın her yerde bulunan dilini ihlal ediyorsunuz: Dil muhtemelen böyle bir şey söylüyor: bir müşteri sipariş isteği verebilir ve bir satın alma kimliği belirlemesine izin verilir.Öyleyse, yeni bir OrderRequest örneği almanın daha iyi bir yolu var :"

var request = OrderRequest.CreateForCustomer(1234);

nerede

private OrderRequest() { ... }

public OrderRequest CreateForCustomer (int customerId)
{
    var request = new OrderRequest();
    ...
    return request;
}

Bunu her sınıf için savunmuyorum, ancak yukarıdaki DDD senaryosu için, yeni bir nesnenin doğrudan oluşturulmasını önlemenin mükemmel bir mantıklı olduğunu düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.