SORU
4 HAZİRAN 2011, CUMARTESİ


API tasarım önlemek için nasıl "çok fazla parametre" sorun?

Bu API işlevi var:

public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d, 
     string e, string f, out Guid code)

Ben bunu sevmiyorum. Çünkü parametre amacıyla gereksiz yere anlamlı hale gelir. Daha yeni alanlar eklemek olur. Zor elden ele dolaşıyor ne olduğunu görmek için. Alt fonksiyonlar tüm parametreleri geçen bir yük oluşturur, çünkü daha küçük parçalara yöntemi yeniden Düzenle. Kod okumak için daha zordur.

Ben en belirgin fikir geldi: bir nesne veri şifrelenmiş ve çevresinde her parametre geçirmeden yerine geçmek teker teker. Ne buldum burada

public class DoSomeActionParameters
{
    public string A;
    public string B;
    public DateTime C;
    public OtherEnum D;
    public string E;
    public string F;        
}

Bu beyan benim API düşük

public ResultEnum DoSomeAction(DoSomeActionParameters parameters, out Guid code)

Güzel. Çok masum görünüyor ama aslında çok büyük bir değişiklik getirmiştir: mutability sunduk. Biz daha önce aslında anonim değişmez bir nesne geçmek mi yapıyor olmuştu çünkü: yığın fonksiyon parametreleri. Şimdi çok değişken olan yeni bir sınıf oluşturduk. Bu durumu değiştirmek için yeteneği oluşturdukarayan. Bu berbat bir şey. Ben şimdi ne yapacağım nesne benim değişmez, istiyorum?

public class DoSomeActionParameters
{
    public string A { get; private set; }
    public string B { get; private set; }
    public DateTime C { get; private set; }
    public OtherEnum D { get; private set; }
    public string E { get; private set; }
    public string F { get; private set; }        

    public DoSomeActionParameters(string a, string b, DateTime c, OtherEnum d, 
     string e, string f)
    {
        this.A = a;
        this.B = b;
        // ... tears erased the text here
    }
}

Aslında yeniden orijinal benim sorunum gördüğünüz gibi: çok fazla parametre. O gitmek için yol yok ortada. Ne yapacağım ben? Böyle değişmezliğini tanıdı kullanmaktır elde etmek için en iyi seçenek, bir "salt okunur" bu gibi yapı:

public struct DoSomeActionParameters
{
    public readonly string A;
    public readonly string B;
    public readonly DateTime C;
    public readonly OtherEnum D;
    public readonly string E;
    public readonly string F;        
}

Bu bize çok fazla parametre ile kurucular önlemek ve değişmezliğini tanıdı elde etmek için izin verir. Aslında tüm sorunları (parametre vb sipariş) giderir. Henüz:

O kafam karıştı ve şu soruyu yazmaya karar verdim: C En basit yol Nedir# "çok fazla parametre mutability tanıtmadan?" sorunu önlemek için Bu amaç için salt okunur bir yapı kullanmak ve henüz kötü bir API tasarımı yok etmek mümkün mü?

AÇIKLAMALAR:

  • Lütfen tek responsibiltiy prensibinin ihlali yok varsayalım. Benim orijinal durumda işlev sadece tek DB kayıt için verilen parametreleri yazar.
  • Belirli bir işlev için özel bir çözüm arayışında değilim. Bu tür sorunlar için genel bir yaklaşım arıyorum. "Sorun olmadan mutability ya da çok kötü bir tasarım tanıtmak. "çok fazla parametre çözümünde özellikle ilgimi çekti

GÜNCELLEME

Cevaplar burada verilen dezavantajlarını farklı avantajları var. Bu nedenle bir topluluk wiki dönüştürmek istiyorum. Kod örneği ve Artıları/Eksileri ile her cevap, gelecekte benzer sorunları için iyi bir rehber olacağını düşünüyorum. Şimdi nasıl yapılacağını öğrenmeye çalışıyorum.

CEVAP
4 HAZİRAN 2011, CUMARTESİ


Oluşturucu bir arada kullanmak ve etki alanına özgü dil--Akıcı Arayüzü API tarzı. API biraz daha ayrıntılı ama ıntellisense ile çok hızlı ve çok kolay bir tür.

public class Param
{
    public string A { get; private set; }
    public string B { get; private set; }
    public string C { get; private set; }

    public class Builder
    {
        private string a;
        private string b;
        private string c;

        public Builder WithA(string value)
        {
            a = value;
            return this;
        }

        public Builder WithB(string value)
        {
            b = value;
            return this;
        }

        public Builder WithC(string value)
        {
            c = value;
            return this;
        }

        public Param Build()
        {
            return new Param { A = a, B = b, C = c };
        }
    }


    DoSomeAction(new Param.Builder()
        .WithA("a")
        .WithB("b")
        .WithC("c")
        .Build());

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • campos9896

    campos9896

    24 Mart 2012
  • MisterBrightside

    MisterBright

    24 Mart 2006
  • Palmundo Ec

    Palmundo Ec

    11 HAZİRAN 2009