Builder deseninin ekibimde kullanımını nasıl teşvik edebilirim?


22

Bizim kod temeli eski ve yeni programcılar, benim gibi, hızla bunu yapmak öğrenmektir bitti yolu bütünlüğü uğruna. Bir yerden başlamak zorunda olduğumuzu düşünerek, bir veri tutucu sınıfını yeniden yansıtmak için kendime verdim:

  • Setter yöntemleri kaldırıldı ve tüm alanları yaptım final(aldığım final"aksiyomatik olarak " iyidir ") Belirleyiciler, yalnızca kurucuda kullanıldı, göründüğü gibi, bunun hiçbir yan etkisi olmadı.
  • Builder sınıfı tanıtıldı

Oluşturucu sınıfı gerekliydi çünkü yapıcı (ilk başta yeniden yönlendirmeyi isteyen şeydi) yaklaşık 3 satırlık bir kod satırı içeriyor. Çok fazla parametresi var.

Şansa sahip olacağı gibi, bir takım arkadaşım başka bir modül üzerinde çalışıyordu ve ayarlayıcılara ihtiyaç duyuyordu, çünkü gerekli olan değerler akışta farklı noktalarda bulunuyordu. Böylece kod şöyle görünüyordu:

public void foo(Bar bar){
    //do stuff
    bar.setA(stuff);
    //do more stuff
    bar.setB(moreStuff);
}

Bunun yerine yapıcıyı kullanması gerektiğini savundum, çünkü ayarlayıcılardan kurtulmak, alanların değişmez kalmasına izin veriyor (daha önce değişmezlik konusunda çılgınca duyduğumu duymuşlardı) ve ayrıca inşaatçılar nesne oluşturmanın işlem yapmasına izin verdiği için de. Aşağıdaki sahte kodu çizdim:

public void foo(Bar bar){
    try{
        bar.setA(a);
        //enter exception-throwing stuff
        bar.setB(b);
    }catch(){}
}

Bu istisna ortaya çıkarsa, barbir oluşturucudan kaçınılması gereken bozuk verilere sahip olur:

public Bar foo(){
        Builder builder=new Builder();
    try{
        builder.setA(a);
        //dangerous stuff;
        builder.setB(b);
        //more dangerous stuff
        builder.setC(c);
        return builder.build();
    }catch(){}
    return null;
}

Ekip arkadaşlarım, söz konusu istisnanın hiçbir zaman ateşlemeyeceğini, bu belirli bir kod alanı için yeterince adil olduğunu, ancak ağaç için ormanın eksik olduğuna inanıyorum.

Uzlaşma eski çözüme geri dönmek, yani parametresiz bir yapıcı kullanmak ve gereken her şeyi ayarlayıcılarla ayarlamaktı. Bunun sebebi, bu çözümün benimkinin ihlal ettiği KISS ilkesini izlemesiydi.

Bu şirkette yeniyim (6 aydan az) ve bunu kaybettiğimin tamamen farkındayım. Sahip olduğum soru (lar):

  • "Eski yöntem" yerine Oluşturucular'ı kullanmanın başka bir argümanı var mı?
  • Önerdiğim değişiklik gerçekten buna değer mi?

ama gerçekten,

  • Yeni bir şeyler denemeyi savunurken bu tür argümanları daha iyi sunabilmek için herhangi bir ipucunuz var mı?

6
Oluşturucu, bir şekilde değerleri ayarlamanız gerekecek. Bu yüzden temel sorunu çözmez.
Amy Blankenship

3
(Daha / tehlikeli / istisna atma) olaylarının aramadan önce taşınamayacağının nedeni nedir setA?
yatima2975

2
Yalnızca 3 satır yapıcı parametresi mi? Bu o kadar da kötü değil.
pjc50 06.06.2016

7
Herhangi bir yazılım tasarımında her zaman karmaşıklık ve ayrılma arasında değişimler vardır. Kişisel olarak sizinle hemfikir olduğumu düşünmeme rağmen, inşaat işçisinin burada iyi bir çözüm olduğunu düşünüyorum. Aşırı derecede karmaşık olan bir yazılım kullanıyorum ve bunun sebebi de her yeni işe alımın haydut olması ve "Bu aptal, bu yeni şeyi benim tarzım için yapacağım" demesi, dolayısıyla zamanlama için 5 çerçevemiz var. arkaplan işleri ve veritabanını sorgulamak için 8 yöntem. Ölçülmede her şey yolunda ve bu gibi durumlarda net bir doğru cevap yok.
Brandon,

3
KISS bulanık bir konsepttir, değiştirilebilir nesneler, geliştiriciler tarafından büyük ölçüde küçümsenmeyen karmaşıklık kaynağıdır, çok iş parçacığı, hata ayıklama ve istisnaları değişmez olandan çok daha zor hale getirir. Nesne geçerlidir ya da inşaatta bir istisna yaratılmıştır (bu istisnayı yakalamak için hangi yer daha iyi?).
Alessandro Teruzzi

Yanıtlar:


46

Bir yerden başlamak zorunda olduğumuzu düşünerek, bir veri tutucu sınıfını yeniden yansıtmak için kendime verdim

Yanlış gittiği yer burasıdır - beklenen her şeyden çok farklı olması için kod tabanında büyük bir mimari değişiklik yaptınız. Meslektaşlarını şaşırttın. Sürpriz sadece bir partiyi içeriyorsa iyidir, en az sürpriz ilkesi altındır (partileri olsa bile, o zaman temiz külot giyeceğimi biliyorum!)

Şimdi, bu değişimin değersiz olduğunu düşünüyorsanız, değişikliği gösteren sözde kodun taslağını çizip meslektaşlarınıza (ya da en azından mimara en yakın rolü olan kimseye) sunmak ve bir şey yapmadan önce ne düşündüklerini görmek çok daha iyi olurdu. Olduğu gibi, haydut gittin, tüm kod tabanının senin uygun olduğunu düşündüğün gibi oynamak için senin olduğunu düşündün. Takımdaki bir oyuncu, takım oyuncusu değil!

Size biraz sert davranıyor olabilirim, ama tam tersi yerdeyim: bazı kodları inceleyin ve "WTF burada oldu mu ?!" diye düşünün, yalnızca yeni adamı bulmak için (neredeyse her zaman yeni adam) değişmeye karar verdi. “doğru yolu” olması gerektiğini düşündüğü şeylere dayanarak bir sürü şey. SCM tarihini de bozan başka bir büyük problem.


7
“Sürpriz sadece bir partiyi kapsıyorsa iyidir,” aslında herkes için doğru değil !! Bana sürpriz bir attı herhangi sözde arkadaşımla konuşuyordum kessen şey , özel bir parti . İle insanlar . Ugh.
Darkhogg

3
Öyleyse her yeniden düzenleme ve tasarım deseni veya "Buradaki erişimci ve mutatoru mu yoksa oluşturma düzeni mi kullanırım?" Bir ekip tarafından onaylanması gerekiyor, geliştiriciler doğru olanı yapma konusunda kendilerini nasıl güçlendiriyorlar? Her şeyin bir komite tarafından tasarlanması gerekiyorsa nasıl ileriye dönük değişiklikler yapacaksınız. Daha önce OP'nin ayakkabısında bulundum, daha önce herkesin değiştirmekten korktuğu anlamsız kodları (yeni adam olarak) kullanmak zorunda kaldığım için tutarlıydı . Tutarlılık iyidir ve hepsidir, ancak iyileştirme pahasına değildir.
Brandon

11
@ Hayır, ama onları etkileyebilecek geniş kapsamlı her değişiklik gerekir. Eğer bir hatayı düzeltmek zorunda kalırsanız, bu başka bir kod bitidir - önemli değil. Herkesi etkileyen bir karar verirseniz, en azından ne yaptığınızı onlara söylemenin nezaketi olur. Anlamsız kodunuzu değiştirmek için ekipten anlaşma alabilirsiniz ve değişiklikleriniz yeni tutarlılık haline gelir. Sadece meslektaşlarınla ​​konuşmalısın. "
Hepimizden

13
@Brandon'un bir deyişi var: "Cehenneme giden yol iyi niyetlerle döşenmiştir". Tutarlılık sadece iyi değil , gerekli ! Her biri farklı bir tarzda ve / veya mimaride yazılmış olan 20 uygulamayı toplu olarak yöneten bir geliştirici ekibini yönetmeye çalıştığınızı hayal edin, çünkü tercihler, mevcut teknoloji, trendler vb. Ekibin bir şeyin değişmesi gerektiği konusunda hemfikir olması, uzun süredir devam eden bir problemi çözdükleri ve en iyi olduğunu düşündüğünüz şeyle süvarilere gitmek için kovuldukları için kabul edilen yeni adam arasındaki fark olabilir .
DrewJordan

3
@Brandon - Eğer haydutup "herkesin yanlış olduğunu kabul edecek bir şey" düzeltmek için gideceksen, muhtemelen en iyi ihtimalle farklı kamplarda olacak bir şey seçmek yerine "herkesin kabul edeceği bir şey" seçerek daha başarılı olabilirsin değişmezlik gibi. İyi bir tasarım / mimari pratikte hiçbir ödül için değişmezliği yüksek maliyet haline getirir. Ekibiniz setter kullandığı için problem yaşamıyorsa, o zaman bir problemi çözmediniz demektir. OTOH, eğer bu sık sık bir hata kaynağı olsaydı, sonuçlar bir takım kararını haklı çıkarmış gibi görünüyor.
Dunk,

21

Şansa sahip olacağı gibi, bir takım arkadaşım başka bir modül üzerinde çalışıyordu ve ayarlayıcılara ihtiyaç duyuyordu, çünkü gerekli olan değerler akışta farklı noktalarda bulunuyordu.

Açıklandığı gibi, kodun ayarlayıcıları ne gerektirdiğini anlamadım. Muhtemelen kullanım durumu hakkında yeterince bilgim yok ama neden nesneyi başlatmadan önce tüm parametreler bilinene kadar beklemiyorsunuz?

Alternatif olarak, durum ayarlayıcılar gerektiriyorsa: nesne hazır olduktan sonra alanları değiştirmeye çalışırsanız, kodunuzu o ayarlayıcılara dondurmanız için bir onaylama hatası (aka programlayıcı hatası) atayın.

Ayarlayıcıları kaldırmak ve final kullanmak , değişmezliği zorlamanın yanı sıra, bunu yapmanın "uygun" bir yolu, ama gerçekten zaman geçirmeniz gereken şey bu mu?

Genel ipuçları

Eski = kötü, yeni = iyi, benim yöntemim, senin yöntemin ... böyle bir tartışma yapıcı değil.

Şu anda, nesnenizin kullanıldığı yöntem bazı gizli kurallara uyuyor. Bu, kodunuzun yazılı olmayan belirtiminin bir parçasıdır ve ekibiniz kötüye kullanma kodunun diğer bölümleri için fazla risk olmadığını düşünebilir. Burada yapmak istediğiniz, kuralı bir Oluşturucu ve derleme zamanı denetimleriyle daha açık hale getirmektir.

Bir şekilde kod yenileme, Kırık Pencere teorisine bağlıdır: gördüğünüz gibi herhangi bir sorunu çözmenin doğru olduğunu hissedersiniz (veya daha sonra "kalite iyileştirme" toplantısı için not alın); güvenli ve temiz. Siz ve ekibiniz, "yeterince iyi" ne olduğu konusunda aynı fikre sahip değilsiniz. Şifreyi daha iyi, iyi niyetle geliştirmek için katkıda bulunma ve yapma fırsatı olarak gördüğünüz, muhtemelen mevcut ekipten farklı olarak görülüyor.

Bu arada, ekibinizin atalet, kötü alışkanlıklar, eğitim eksikliği, mutlaka yapabileceğiniz en kötü şey olduğu varsayılmamalı, yapabileceğiniz en kötü şey, onlara göstermek için orada olan herkesin bildiği bir görüntüsünü yansıtmaktır. Kodlama Örneğin, değişmezlik yeni bir şey değil , akranlarınız muhtemelen bu konuyu okudu ama bu konuyu bloglarda popüler hale getirmek, onları kodlarını değiştirerek zaman geçirmeye ikna etmek için yeterli değil.

Sonuçta, mevcut bir kod tabanını iyileştirmenin sonsuz yolları var, ancak zaman ve paraya mal oluyor. Koduna bakabilir, "eski" diyebilir ve nitpick için bulabileceğim şeyler bulabilirim. Örneğin: hiçbir resmi şartname, yeterli belki yeterli değildir yorum veya testler, yeterli kod kapsamı, unoptimal algoritması, çok fazla bellek kullanımı, her durumda, vb "en iyi" olası tasarım deseni kullanmayan iddia bıktıracak . Ancak, yükselteceğim çoğu nokta için, şunu düşünürsünüz: sorun değil, kodum işe yarıyor, daha fazla zaman harcamanıza gerek yok.

Belki de ekibiniz önerdiğiniz şeyin azalan getiriler noktasının ötesinde olduğunu düşünüyor. Gösterdiğiniz örnek bir nedenden ötürü gerçek bir hata örneği bulmuş olsanız bile (istisna dışında) muhtemelen bir kez düzeltir ve kodu yeniden düzenlemek istemezler.

Öyleyse soru, sınırlı olmaları kaydıyla zamanınızı ve enerjinizi nasıl harcayacağınızla ilgili ? Yazılımda yapılan sürekli değişiklikler var ancak genel olarak fikriniz, üzerine iyi argümanlar sunana kadar olumsuz bir puanla başlar. Fayda konusunda haklı olsanız bile, kendi başına yeterli bir argüman değildir, çünkü “Sahip olmak güzel, bir gün… ” sepetinde bitecek .

Argümanlarınızı sunduğunuzda, bazı "akıl sağlığı" kontrolleri yapmanız gerekir: bu fikri kendiniz mi satmaya çalışıyorsunuz? Ya bunu başkası takıma sunsaydı? Mantıklarında bazı kusurlar bulabilir misiniz? Bazı genel en iyi uygulamaları uygulamaya mı çalışıyorsunuz yoksa kodunuzun özelliklerini dikkate mi aldınız?

Daha sonra, ekibinizin geçmiş "hatalarını" düzeltmeye çalışıyormuş gibi görünmediğinizden emin olmalısınız. Sizin fikrinizin olmadığını ancak makul ölçüde geri bildirim alabileceğinizi göstermeye yardımcı olur. Bunu ne kadar çok yaparsanız önerileriniz de o kadar fazla takip edilir.


Kesinlikle haklısın. Küçük bir itiraz: "yeni, süper harika yeni yolum" vs "eski yol" değil. Anlamsızca konuşabileceğimin farkındayım. Benim sorunum şu ki, yazılım uygulamalarını kullanmaya devam ederek şirketteki herkes korkunç buluyor, geliştirici olarak durabilirim. Bu yüzden yanılsam bile bazı değişiklikler yapmaya çalışıyorum. (Görev, ilgili bir sınıfı yeniden düzenlemek için bir istek tarafından tetiklendi)
Rath

@rath Geliştirilen yeni kod tabanı yok mu?
biziclop

@biziclop Eski kod tabanına bağlı yeni modüller var. Son zamanlarda bir üzerinde çalıştım. Mutlu günler.
Rath

5
@rath Belki de kendi gelişiminizi ilerletebileceğiniz kendi zamanınızda üzerinde çalışabileceğiniz kişisel bir projeye ihtiyacınız var? Ben de "Oluşturucu" kalıp argümanınıza ikna olmadım; alıcılar / belirleyiciler, sağladığınız bilgilere dayanarak mükemmel bir Tamam gibi görünüyor. İşvereninize ve ekibinize karşı sorumlu olduğunuzu unutmayın; Önceliğiniz, yaptığınız her işin sorumlu olduğunuz kişilerin yararına olmasını sağlamaktır.
Ben Cottrell

@rath, "eski / yeni" bir kodda olmasanız bile, önemli olan, alıcı tarafından nasıl algılandığı, özellikle de sizden daha fazla karar gücüne sahip olmalarıdır. Geliştirdiğiniz ürün için değil, kendi menfaatinize değişiklik getirmek istiyormuş gibi görünüyorsunuz. Şirketteki herkes uygulamayı korkunç buluyorsa, sonuçta değişecek, ancak bu bir öncelik gibi görünmüyor.
coredump

17

Builder deseninin ekibimde kullanımını nasıl teşvik edebilirim?

Sen değil.

Yapıcınızın 3 satır parametresi varsa, çok büyük ve çok karmaşıktır. Hiçbir tasarım deseni bunu düzeltemez.

Verileri farklı zamanlarda kullanıma sunulan bir sınıfa sahipseniz, iki farklı nesne olmalı ya da tüketiciniz bileşenleri bir araya getirmeli ve ardından nesneyi oluşturmalıdır. Bunu yapmak için bir inşaatçıya ihtiyaçları yok.


Bu Strings ve diğer ilkellerin büyük bir veri sahibi . Hiçbir yerde hiçbir mantık yok, hatta nulls'yi bile kontrol etmiyoruz . Bu yüzden sadece tam bir boyut, başlı başına bir karmaşıklık değil. Gibi builder.addA(a).addB(b); /*...*/ return builder.addC(c).build();bir şey yapmanın gözler üzerinde çok daha kolay olacağını düşündüm .
Rath

8
@rath: Strings ve diğer ilkellerin büyük bir veri sahibi. => o zaman başka problemlerin var, kimsenin umursamadığı e-posta alanı yanlışlıkla adamın posta adresine atanmış mı umursamıyor ...
Matthieu M.

@MatthieuM. Sanırım bir zamanlar bir sorun :)
rath

@rath - Kesinlikle iyi bir doğrulama kontrol şeması dahil etmek, oluşturucu modelini zaten var olan koda nasıl çarpıştırılacağını bulmaya çalışmaktan çok daha kullanışlı ve daha kolay alınmış gibi görünüyor. Başka bir yerde kendini daha iyi hale getirmek istediğini söyledin. En az çaba ve sonuç için maksimum kazanç elde etmeyi öğrenmek kesinlikle geliştirilmesi gereken bir özelliktir.
Dunk,

1
Bundan çok daha fazla parametreli birçok kurucu soooooo'ya sahibim. IoC desenlerinde gerekli. Bu cevapta genelleme kötü.
djechlin

16

Başkalarıyla iyi çalışmaktansa haklı olmaya daha odaklı görünüyorsunuz. Daha da kötüsü, yaptığınız şeyin bir güç mücadelesi olduğunun farkındasınız ve yine de deneyim ve otoritesine meydan okuyan insanlara işlerin nasıl hissedebileceğini düşünmekte başarısız oluyorsunuz.

Bunu tersine çevir.

Başkalarıyla çalışmaya odaklanın. Düşüncelerinizi öneri ve fikir olarak kabul edin. Sizinkini düşünmelerini sağlamak için sorular sormadan önce, onların fikirlerini konuşmalarını sağlayın. Doğrudan karşı karşıya gelmekten kaçının ve grubun yolunu değiştirmek için (şimdilik) grubun değişmesi için bir yokuş yukarı mücadele etmekten daha verimli olduğunu kabul etmeye istekli olun. (Her şeyi geri getirmesine rağmen.) Sizinle çalışmayı bir neşe haline getirin.

Bunu sürekli yapın ve daha az çatışma yaratmalı ve fikirlerin başkaları tarafından benimsenmesini sağlayacak daha fazlasını bulmalısınız. Hepimiz mükemmel bir mantıksal argümanın başkalarını şaşırtacağı ve günü kazanacağı yanılsamasından muzdaripiz. Ve bu şekilde çalışmazsa, olması gerektiğini düşünüyoruz .

Ancak bu, gerçeklikle doğrudan bir çatışma içerisinde. Çoğu argüman ilk mantıksal noktaya gelmeden kaybolur. İddiaya mantıklı insanlar arasında bile, psikoloji akıldan kaçıyor. İnsanları, doğru şekilde duyulmak için psikolojik engellerin ötesine geçmekle ve kusursuz bir mantıkla değil.


2
Frame your thoughts as suggestions and ideas. Get THEM to talk through THEIR ideas before asking questions to make them think about yoursYine de bunun için +1
rath

2
@rath Diğer kişilerin kitabınızdan okumadığını aklınızda bulundurun. Tartışma yaptığınız kişinin, yüz yüze gelmesi, sizin amaçlarınıza aykırı olması muhtemeldir.
Iker

2
@rath: Doğru ya da yanlış yoktur. Sadece takaslar. Ve ticaret sicillerinde olmayanlardan daha sık, yalnızca koddan daha fazlasını içerir.
Marjan Venema,

1
@Dunk Var olan tek şey değiş tokuşlardır. Takaslar net ve bir tarafta açıkça görülürse, onlara doğru ya da yanlış diyoruz. Ancak, en baştan beri değiş tokuş olmalarına odaklanırsak, bu belirsizliğin ne zaman belirsizleşeceğini bilmek kolaylaşır.
btilly

2
Farkında olduğum, en iyi olmadığı durumlar dışında istisnaları olmayan tek bir programlama "en iyi uygulama" yoktur. Bazen bu istisnaları bulmak zor, ama her zaman varlar.
btilly

11

"Eski yöntem" yerine Oluşturucular'ı kullanmanın başka bir argümanı var mı?

“Yeni bir çekicin olduğunda, her şey bir çiviye benzeyecek.” - bu soruyu okuduğumda düşündüğüm şeydi.

İş arkadaşın olsaydım, sana neden "kurucudaki tüm nesneyi başlatmıyorsun?" Diye sorardım. Sonuçta işlevselliği budur. Neden yapıcı (veya başka bir tasarım) kalıbı kullanılmalı?

Önerdiğim değişiklik gerçekten buna değer mi?

Bu küçük kod parçacığından söylemek zor. Belki de öyle - sen ve meslektaşların bunu değerlendirmek istiyor.

Yeni bir şeyler denemeyi savunurken bu tür argümanları daha iyi sunabilmek için herhangi bir ipucunuz var mı?

Evet, konuşmadan önce konu hakkında daha fazla bilgi edinin. Tartışmaya başlamadan önce kendinizi iyi argümanlar ve gerekçelerle donatın.


7

Becerilerim için işe alındığım bir durumdaydım. Kodu görmeye başladığımda, peki .. daha sonra korkunçtu. Daha sonra temizlemeye çalışırken, uzun zamandır orada olan biri değişiklikleri her zaman bastırır, çünkü faydaları görmezler. Anlattığın bir şeye benziyor. Bu pozisyondan vazgeçmemle sona erdi ve şimdi daha iyi bir uygulamaya sahip bir şirkette çok daha iyi gelişebilirim.

Takımda diğerleriyle birlikte rol oynaman gerektiğini düşünmüyorum çünkü daha uzun süredir oradalar. Ekip üyelerinizin, üzerinde çalıştığınız projelerde kötü uygulamaları kullandığını görürseniz, olduğu gibi imoda belirtmeniz gerekir. Eğer değilse, o zaman çok değerli bir kaynak değilsinizdir. Bunları tekrar tekrar işaretlerseniz, ama kimse dinlemiyorsa, sizden değiştirme veya değiştirme işi için yönetim isteyin. Oradaki kötü uygulamalara uyum sağlamanıza izin vermemeniz çok önemlidir.

Asıl soruya

Neden değişmez nesneler kullanıyorsunuz? Çünkü neyle uğraştığını biliyorsun.

Ana makineyi bir ayarlayıcı ile değiştirmenize izin veren bir db bağlantınız olduğunu, o zaman hangi bağlantının olduğunu bilmiyorsunuz. Değişmez olmak, o zaman biliyorsun.

Bununla birlikte, kalıcılıktan alınabilecek ve daha sonra yeni verilerle devam ettirilebilecek bir veri yapınız olduğunu söyleyin, o zaman bu yapının değişmez olduğu mantıklı geliyor. Aynı varlık, ancak değerler değişebilir. Bunun yerine, değişken değer nesnelerini argüman olarak kullanın .

Ancak soruyu odakladığınız şey, yapıcıdaki bağımlılıklardan kurtulmak için oluşturucu bir kalıptır. Buna büyük bir şişman HAYIR diyorum . Örnek zaten açıkça karmaşıktır. Gizlemeye çalışmayın, düzeltin!

Tl, Dr.

Ayarlayıcıları çıkarmak, sınıfa bağlı olarak doğru olabilir. Oluşturucu paterni sorunu çözmüyor, sadece gizliyor. (Halının altındaki kir göremiyorsanız bile mevcuttur)


Durumunuzun ayrıntılarını bilmiyorum ama eğer ilk önce insanların kendi becerilerinize güven duymadan, her şeyi değiştirmeye çalıştıysanız ya da "neden" şeyleri yaptıkları gibi yaptıklarını öğrenmek için zaman ayırmıyorsanız, o zaman tam olarak tedavi edildiyseniz hemen hemen her şirkette, hatta gerçekten iyi firmalarda bile görüleceği gibi. Aslında, özellikle de gerçekten iyi olanlarda. İnsanlar birilerinin becerilerine güvenince, o zaman sadece önerileriniz için zorlayıcı bir durum yaratma meselesidir. Eğer zorlayıcı bir dava açamazsanız, öneriniz o kadar iyi olmayabilir.
Dunk,

1
idk varsayımlarınıza ne cevap vereceğime @Dunk Her şeyi değiştirmeye çalışmıyordum, temizlemeye çalıştım. Ve ne yaptıklarını bilen insanlar değildi, gururla sınıflar yarattılar, sınıflar ve fonksiyonlar yarattılar, yüzlerce kod satırı, idk ile ne kadar devlet, küresel vs. Ben de ifademin yanındayım. Kendinizi, uyum sağlamanız için kötü bir pratiği benimsemeniz gereken bir konumda olduğunuzu fark ettiğinizde asla geri adım
superhero

@Dunk İnsanların ekip üyesi olarak kodlanmasının benim yaptığım gibi olmadığını değiştirmeyi deneyin. Ama onlara en baştan anlatıyorum; "Bu projede tamamen yeniden yazmadan çalışmayacağım" , eğer kod bir çöplük ise. Eğer bu uygun değilse, o zaman ... karşılıklı. Bu sadece bir rahatlık değil, ürettiğim şeyin sorumluluğunu alabilmem gerektiği gerçeği ile ilgili. Projedeki çevreleyen kod tam bir karışıklıksa bunu yapamam.
süper kahraman

Çöp olan bir kodla "sonsuza kadar" çalışmak zorunda değilsiniz ya da sadece bu şekilde yapıldığı için kötü uygulamaları takip etmeniz gerekmez. Ancak, bir şeyleri değiştirmekte başarılı olmak istiyorsanız, o zaman ilk önce güvenilirliğinizi kanıtlamanız daha iyi oldu. Hemen hemen her geliştirici miras aldıkları kodun çöp olduğunu düşünüyor. Eğer her şirket yeni beceri ile her zaman gerçek yetenek seviyesini bile bilmeden hemfikir olsaydı, çöplük bir çöplüğe dönüşür. Ayrıca, işlerin neden olduğu gibi yapıldığını anlamak için zaman ayırmalısınız. Bazen "yanlış" yol, belirli bir durum için "doğru" yoldur.
Dunk

@ Dunk, ben bu konuda farklı bir fikrim olduğunu görüyorum. Diğer cevaplardan okuyorsanız, sizinki daha popüler görünüyor. Kabul etmiyorum, bu cevabı neden muhalefet olarak yazdım. Senin söylediklerin fikrimi değiştirmedi.
superhero,

2

Diğer tüm cevaplar çok faydalı olsa da (benimkinden daha yararlı olacak), henüz bahsetmediğiniz inşaatçıların bir özelliği var: bir nesnenin yaratılmasını bir sürece dönüştürerek karmaşık mantıksal kısıtlamaları uygulayabilirsiniz.

Örneğin, belirli alanların birlikte veya belirli bir sırayla ayarlanmasını zorunlu kılabilirsiniz. Bu kararlara bağlı olarak hedef nesnenin farklı bir uygulamasını bile döndürebilirsiniz.

// business objects

interface CharRange {
   public char getCharacter();
   public int getFrom();
   public int getTo();
}

class MultiCharRange implements CharRange {
   final char ch;
   final int from;
   final int to;

   public char getCharacter() { return ch; }
   public int getFrom() { return from; }
   public int getTo() { return to; }
}

class SingleCharRange implements CharRange {
   final char ch;
   final int position;

   public char getCharacter() { return ch; }
   public int getFrom() { return position; }
   public int getTo() { return position; }
}

// builders

class Builder1 {
   public Builder2 character(char ch) {
      return new Builder2(ch);
   }
}

class Builder2 {
   final char ch;
   int from;
   int to;

   public Builder2 range(int from, int to) {
      if (from > to) throw new IllegalArgumentException("from > to");
      this.from = from;
      this.to = to;
      return this;
   }

   public Builder2 zeroStartRange(int to) {
      this.from = 0;
      this.to = to;
      return this;
   }

   public CharRange build() {
      if (from == to)
         return new SingleCharRange(ch,from);
      else 
         return new MultiCharRange(ch,from,to);
   }
}

Bu pek mantıklı gelmiyor ama üç özelliğin hepsini gösteriyor: karakter her zaman önce belirlenir, aralık sınırları her zaman birlikte belirlenir ve doğrulanır ve uygulama sırasında derleme sırasında uygulamanızı seçersiniz.

Bunun daha okunaklı ve güvenilir bir kullanıcı koduna nasıl yol açabileceğini görmek kolaydır, ancak sizin de görebileceğiniz gibi, bunun bir dezavantajı vardır: çok sayıda ve çok sayıda üretici kodu (ve parçacıkları kısaltmak için kurucuları bile bıraktım). Böylece takası hesaplamaya çalışıyorsunuz, şöyle sorular sorarak:

  • Nesneyi yalnızca bir veya iki yerden başlatır mıyız? Bunun değişmesi olası mı?
  • Belki de orijinal nesneyi daha küçük nesnelerin bileşimine yeniden yerleştirerek bu kısıtlamaları zorlamalıyız?
  • Yapıcıyı yöntemden yönteme buralarda geçirebilir miyiz?
  • Bunun yerine statik bir fabrika metodu kullanabilir miyiz?
  • Harici bir API'nin parçası, mümkün olduğunca kusursuz ve kaygan olması gereken mi?
  • Eğer inşaatçılarımız olsaydı, mevcut hata biriktirme sayımızın yaklaşık kaçından kaçınabilirdi?
  • Ne kadar ekstra dökümantasyon yazarız?

Meslektaşlarınız, takasın faydalı olmayacağına karar verdi. Nedenleri açıkça ve dürüstçe, tercihen soyut ilkelere başvurmadan, ancak bu çözümün veya bunun pratik sonuçlarına odaklanmadan konuşmalısınız.


1
Bir nesnenin yaratılmasını bir sürece dönüştürerek karmaşık mantıksal kısıtlamaları uygulayabilirsiniz. BAM. Tüm bunlar, daha küçük, ayrık, daha basit adımlarda organize edildiğinde karmaşıklık anlamına gelir .
radarbob

2

Bu sınıf aslında aynı dosya / sınıf tanımında bir araya getirilen birden fazla sınıf gibi görünüyor. Bu bir DTO ise, bir seferde başlatılması ve değişmez olması mümkün olmalıdır. Tüm alanlarını / özelliklerini tek bir işlemde kullanmazsanız, o zaman neredeyse kesinlikle Tek Sorumluluk ilkesini çiğniyor. Daha küçük, daha uyumlu, değişken DTO sınıflarına ayırmak yardımcı olabilir. Zaten yapmadıysanız, Kodları ve değişiklik yapmanın yararlarını daha iyi anlayabiliyorsanız Temiz Kod okumayı düşünün .

Kelimenin tam anlamıyla mafya programlaması olmadıkça komite tarafından bu seviyede kod tasarlayabileceğinizi sanmıyorum (bu tür bir takımdaki gibi görünmüyor), bu nedenle en iyi muhakeme, ve yanlış karar verdiğin ortaya çıkarsa çeneye götür.

Ancak, olası sorunları kodla olduğu gibi dile getirebildiğiniz sürece , kabul edilemese bile, bir çözümün gerekli olduğunu tartışabilirsiniz . İnsanlar daha sonra alternatifler sunmakta özgürler.

" Güçlü görüş, zayıf tutulan " iyi bir ilkedir - bildiklerinize dayanarak güvenle devam edersiniz, ancak karşı karşıya kalan bazı yeni bilgiler bulursanız, mütevazı olun ve istifa edin ve doğru çözümün ne olması gerektiği hakkında bir tartışma yapın olmak. Tek yanlış cevap, daha da kötüye gitmesini bırakmak.


Kodun neden bu kadar kötü kokması nedeninin bir parçası olan kesinlikle tasarım komitesi tarafından tasarlanmamıştır. Sanırım çok iyi bir şey. Bu ise bir DTO ama parçalara bölmek olmaz; Kod tabanı kötü ise, DB çok daha kötüdür. Son paragraf için +1 (öncelikle).
Rath
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.