Üçüncü taraf bir kütüphane kullanıyorum. Bana niyetlerimiz ve amaçlarımız için muhtemelen şu şekilde uygulanan bir POJO verdiler :
public class OurData {
private String foo;
private String bar;
private String baz;
private String quux;
// A lot more than this
// IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR
OurData(/* I don't know what they do */) {
// some stuff
}
public String getFoo() {
return foo;
}
// etc.
}
API'lerini kapsüllemek ve birim testini kolaylaştırmak dahil ancak bunlarla sınırlı olmamak üzere birçok nedenden dolayı, verilerini sarmak istiyorum. Ama çekirdek sınıflarımın verilere bağımlı olmasını istemiyorum (yine test nedenleriyle)! Şu anda böyle bir şey var:
public class DataTypeOne implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
}
}
public class DataTypeTwo implements DataInterface {
private String foo;
private int bar;
private double baz;
public DataTypeOne(String foo, int bar, double baz, String quux) {
this.foo = foo;
this.bar = bar;
this.baz = baz;
this.quux = quux;
}
}
Ve sonra bu:
public class ThirdPartyAdapter {
public static makeMyData(OurData data) {
if(data.getQuux() == null) {
return new DataTypeOne(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
);
} else {
return new DataTypeTwo(
data.getFoo(),
Integer.parseInt(data.getBar()),
Double.parseDouble(data.getBaz()),
data.getQuux();
);
}
}
Bu bağdaştırıcı sınıfı, üçüncü taraf API hakkında bilmeniz gereken diğer birkaç sınıfla birleştirilir, bu da sistemimin geri kalanı boyunca yaygınlığını sınırlar. Ancak ... bu çözüm BRÜT! Temiz Kod'da, sayfa 40:
Üçten fazla argüman (çok yönlü) çok özel bir gerekçe gerektirir - ve daha sonra yine de kullanılmamalıdır.
Düşündüğüm şeyler:
- Statik yardımcı yöntem yerine fabrika nesnesi oluşturma
- Bajillion argümanlarına sahip olma sorununu çözmez
- Bağımlı bir kurucuya sahip bir DataTypeOne ve DataTypeTwo alt sınıfı oluşturma
- Hala çok yönlü korumalı bir kurucu var
- Aynı arabirime uyan tamamen ayrı uygulamalar oluşturun
- Yukarıdaki fikirlerden birden fazlası aynı anda
Bu durum nasıl ele alınmalı?
Bunun bir yolsuzlukla mücadele katmanı durumu olmadığını unutmayın . API'lerinde yanlış bir şey yok. Sorunlar:
- Veri yapılarımın olmasını istemiyorum
import com.third.party.library.SomeDataStructure;
- Test yapılarımda veri yapılarını oluşturamıyorum
- Mevcut çözümüm çok yüksek argüman sayımları ile sonuçlanıyor. Veri yapılarına geçmeden argüman sayılarını düşük tutmak istiyorum.
- Bu soru "olduğunu Ne bir anti-yolsuzluk tabakasıdır?". Benim sorum, " bu senaryoyu çözmek için bir deseni, herhangi bir deseni nasıl kullanabilirim?"
Ben de kod istemiyorum, ya da (aksi takdirde bu soru SO olurdu), sadece yeterli kod (bu soru sağlamaz) yazmak için etkinleştirmek için yeterli bir cevap istiyor.
The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification — and then shouldn’t be used anyway.