“Modülerlik” elde etmek için kısmi sınıfları kullanmak yaygın mıdır?


24

Kısa süre önce kod tabanımızda, 800 dosyadan oluşan ve kısmi bir sınıf olarak bölünmüş yaklaşık 800 yöntem içeren 'tanrı sınıfı' yaratan bir durumla karşılaştım.

Diğer takıma bunu sordum. Bağırsak tepkimem onu ​​yörüngeden çekmekteyken, iyi bir tasarım, ortak bir uygulama olduğunu ve 'modülerliği' ve 'uygulama kolaylığını' desteklediğinden ısrar ediyorlar çünkü yeni geliştiriciler geri kalanını neredeyse hiç bilmeden işlevsellikten caydırabilirler. sistemin.

Bu aslında yaygın bir uygulama mı yoksa herhangi bir şekilde iyi bir fikir mi? Bu canavarı yıkmak için hemen adımlar atmaya meyilliyim (ya da en azından daha fazla büyümesini engelleyeceğim) ama yanlış olduğuma inanmaya hazırım.


6
ateşle öldür! Ancak cidden, diğer ekip bu iddia edilen ortak uygulama için herhangi bir atıfta bulunabilir mi?
MattDavey

1
Yok. Eminim duman esiyorlar ama çekiciyi düşürmeden önce gerekli özeni göstermeye çalışıyorum.
Joshua Smith,

Bunu sürekli yapmamak için sebepleri nedir?
JeffO

3
Onlardan, bir cümleyle, 135 dosyadaki 800 yöntemin hepsinin birbiriyle ortak neleri olduğunu açıklamasını isteyin. Herhangi bir aklı başında ve makul bir sınıf için bunu cevaplamak mümkün olmalıdır.
Carson63000,

3
@ Carson63000 "Projenin gerekli tüm fonksiyonlarını yerine getirir." bir cümleniz var.
Ryathal

Yanıtlar:


39

Bu hiçbir şekilde iyi bir fikir değildir.

Form tasarımcısına yardımcı olmak için kısmi sınıflar mevcuttur. Bunları başka bir nedenden dolayı kullanmak (ve tartışmalı olarak amaçlanan amaçları için, ancak bu farklı bir konu) kötü bir fikirdir, çünkü okunması ve anlaşılması zor olan şişirilmiş sınıflara yol açar.

Şuna bakın: Eğer tek bir dosyada 800 yöntemle bir tanrı sınıfı, her şeyin nerede olduğunu bildiğiniz yer kötü bir şeyse - ve herkesin öyle olduğunu kabul edeceğini düşünüyorum - o zaman nasıl 800 yöntemle bir tanrı sınıfı yapabilir 135 dosya arasında yayılmış, nerede yok her şey muhtemelen iyi bir şey nerede biliyor musunuz?


1
Çoğunlukla katılıyorum, ancak partialoluşturulan kod olmadan bile yararlı olabilecek bazı nadir durumlar olabileceğini düşünüyorum. Belki yuvalanmış bir sınıf gibi bir şey olduğunda?
svick

1
@svick: Kısmi sınıflar ilginç, ancak genellikle gerekli değil. Bir sınıfı ayrı dosyalara bölmenin, yuvalanmış sınıflar olduğunda neden kullanışlı olacağından emin değilim. İç içe geçen sınıfı kendi fiziksel dosyasında istemiyorsanız. Bu durumda ... maaaaybe sorun değil. ;)
FrustratedWithFormsDesigner

5
Bazen açık arabirim uygulamaları için kısmi sınıflar kullanırım - özellikle System.IConvertible gibi. Her nasılsa sınıfıma muazzam bir bölge koymaktan daha temiz görünüyor.
MattDavey

1
İç içe geçmiş sınıf yorumu aslında gerçekten iyi bir fikir, bunu hiç düşünmedim. Her ne kadar ... bunun organizasyonla ilgisi var, 'modülerlik' den daha çok
Sheldon Warkentin

1
"Form tasarımcısına yardımcı olmak için kısmi sınıflar var." Genel olarak doğru, ancak "... ve diğer kod üreteçleri" eklerdim. Cevabınızın geri kalanını kabul ediyorum;)
Silas

14

Yani soru şuydu:

Bu aslında yaygın bir uygulama mı yoksa herhangi bir şekilde iyi bir fikir mi?

Mevcut cevaplar arasında yankılanan bir no . Yani, bunun hakkında çınlayabileceğim başka şeyler de var; usule ait kodlar bile modüler hale getirilebilir ve her şey dahil ancak mutfak lavabosu modülerliği nasıl elde ettiğinizden ibaret değildir. Devasa bir sınıfın kısmi parçalara ayırdığı gibi, hepsi büyük bir karmaşaya yol açar.

Ancak bu soru, kaçırılanın asıl kritik kısmına kırmızı bir ringa balığıdır ; OP’nin de durum hakkında söylenecekleri var:

(...) Bağırsak reaksiyonum onu ​​yörüngeden çıkarmak iken, ısrar ediyorlar ...

(...) Bu canavarı yıkmak için hemen adımlar atmaya meyilliyim (veya en azından daha fazla büyümesini engelleyeceğim) ama yanıldığımı düşünmeye istekliyim.

ATLARINIZI TUTUN!

Bu, mecazi anlamda konuşan monocle'imin figüratif çayma düşmesini sağlayacak bir şey.

Benzer durumlar içindeyim ve size söyleyeyim: Dürtü yapmaya isteme. Tabii ki, Nuke of Justice Adalet'i takıma bırakabilirsiniz, ancak bunu yapmadan önce lütfen aşağıdaki sıkıntılarla kendinizi şımartın:

Ekibe kodlarının berbat olduğunu ve ayrıldığını söylerseniz ne olacak ?

(... ya da onun gibi bir şey ama daha az saldırgan, gerçekten önemli değil çünkü onlar için tam güçlendirme yapmaya karar verirseniz ne yaparsanız yapın kırgın olacaklar)

Kod tabanındaki mevcut durum nedir? Çalışıyormu? O zaman müşterilerine kodlarının esasen berbat olduğunu açıklamakta büyük problemleriniz olacak . Hangi sebepleri olursa olsun: çalışır durumdayken, çoğu müşteri kodun nasıl organize edileceği ile ilgilenmez.

Ayrıca kendinizi ayakkabılarına koyun, ne yaparlardı? Sizi aşağıdaki çok olası sonuç ile eğlendireyim:

Takım Üyesi # 1: "Son yıllarda yanlış yaptığımızı söyleyen bu adam var."

Takım Üyesi # 2 ve # 3: "Ne salak."

Etkili Ekip Üyesi # 4: "Endişelenme, sadece yönetime gidiyorum ve bir zarar verme olarak rapor edeceğim."

4 numaralı Etkili Ekip Üyesi'nin orada ne yaptığını gördün mü? Yönetime gitti ve şirketteki karmasını azalttı. Amerikan-İtalyan olabilir, herkese endişe etmemesini söylüyor, ama o zaman ırkçı olacağım.

Suçlu takımı, uzun süredir yanlış yaptıklarını kabul etmelerine izin vererek bir köşeye boyamak, aynı zamanda kötü bir fikirdir ve aynı şeye yol açar. Saygı ve bazı ofis politika karmalarını kaybedeceksiniz.

Bir grup kişiye bunu imzalamasını başarmış olsanız bile, "takıma bir ders vermek" için, bunu görünüşte bazı şeyleri yapan oldukça zeki insanlara yaptığınızı unutmayın. Bir kez kod yeniden yazılacak / yeniden düzenlenmiş / dağıtılmış / ne olursa olsun ve ne olursa olsun, itfaiyeci olduğunuz gibi sorumlu tutulacaksınız .

Bu gibi durumlar konusunda çekişmeli olmak, genellikle suçlu oyunların kısır döngüsüne dönüşme riski taşıdığı için kaybetme / kaybetme oyunudur . Bu, bu durum için yetersiz bir sonuçtur. Kazansan bile, birdenbire başkasının yaptığı pisliği devredersin.

Başka (Çok Olgun) Yollar Var

Bir zamanlar benzer bir durumdaydım, sonra dizimden bir ok aldım. Bir süre sonra okuduğum ani kariyeri okla değiştirirken aklımda Terrence Ryan'ın Sürücü Teknik Değişimi adlı bir kitap aldım . Birkaç şüpheci modelini listeler, insanların iyi fikirlere etki etmemeleri. Hepsi OP'nin durumunda geçerli olabilir:

  • Bilgilendirilmemiş - Gerçekten başka yollar olduğunu bilmiyorlardı ya da sadece anlamadılar. Küçük geliştiriciler genellikle bu kategoriye uyuyor ancak zorunlu değil. (Dürüst olmak gerekirse: Bundan daha parlak olacak olan genç geliştiricilerle tanıştım.)
  • Sürü - Kısmi sınıfları kullanmaktan daha iyi teknikler biliyorlardı ancak izin verildiklerini bilmiyorlardı.
  • Cynic - Sadece kısmi sınıflara sahip olmanın sadece tartışma uğruna sizin fikrinizden daha iyi olduğunu iddia etmek istiyorlar. Kalabalığın önünde durmak yerine, kalabalığın içinde yapmak kolaydır.
  • Burned - Bazı garip sebeplerden dolayı, yeni sınıflar oluşturmayı sevmiyorlar, büyük olasılıkla bunu çok zor olarak algılıyorlar.
  • Crunch Time - O kadar meşguldürler, kodlarını düzeltmek için uğraşmazlar.
  • Patron - Düşünüyorlar: "İyi çalışıyor; peki neden rahatsız ediyorsun?"
  • Mantıksız - Tamam, onlar tamamen çılgınca.

Kitap bir strateji listesiyle devam ediyor, ancak OP'nin durumunda bu bir ikna meselesi. Anti-patern hakkındaki gerçeklerle güçlü kafa dolaşmak yeterli değildir.

Kod kalitesini yükseltmek ilginizi çekiyorsa, en azından rahatsız edici ekibin kendi karışıklıklarını yinelemeleri ve düzeltmeleri için şans verin . Şahsen, önde gelen soruları dinleyerek ve sorarak onları sallamaya çalışırdım, öykülerini anlatmalarına izin verin:

  • Tanrı sınıfları tam olarak ne yapıyor?
  • Herhangi bir sorunla karşılaştılar mı? Herhangi bir böcek var mı? Akıllıca düzeltmeler yapmalarını söylemeden onlara önerin.
  • API olarak bu tanrı sınıfının kullanıcısıysanız: Kodu kullanmanın her şeyi kullanmaktan daha basit yolları var mı? Daha basit örnekler önerin, nasıl tepki gösterdiklerini görün.
  • Fonksiyonu yazmak zorunda kalmadan başka bir fonksiyonelliğe geçiş yapabilir misiniz?
  • Bazı eğitimlere ihtiyaçları var mı? Yönetimi onlara vermeye veya kalıplar ve uygulamalar hakkında öğle yemeği toplantıları yapmaya ikna edebilir misiniz?

... ve bunun gibi. Onlara küçük önerilerde bulunun, böylece ileriye gidebilirler. Zaman alır ve bazı ofis politikalarında sınıfta dirsek yağı gerekir ama sabır ve sıkı çalışmak bir erdem midir?


Bu çok anlayışlı bir cevap. Eğer yeni bir geliştiriciyseniz, bunu anlamanız gerekir. Çoğu deneyimli geliştirici bunu birkaç yıl sonra fark eder, bazıları asla yapmaz.
FishySwede

6

MSDN Kısmi Sınıflar ve Yöntemler sayfası, kısmi sınıfları kullanmak için iki durum önerir:
1. Dev bir sınıfı birden fazla ayrı dosyaya bölmek için.
2. Otomatik olarak oluşturulan kaynak kodunu koyacak bir yere sahip olmak.

2 Visual Studio tarafından yoğun olarak kullanılmaktadır (örneğin, aspx dosyaları ve winforms için). Bu, kısmi sınıfların makul bir kullanımıdır.

1 takımınızın yaptığı şeydir. Dev sınıflarınız varken kısmi sınıfları kullanmanın modülerliğe ulaşmak için mükemmel bir yol olduğunu söyleyebilirim, ancak dev sınıflara sahip olmanın kendisi makul değildir. Başka bir deyişle, dev bir sınıfa sahip olmak kötü bir fikirdir, ancak dev bir sınıfa sahip olacaksanız, kısmi sınıflar iyi bir fikirdir.

Bir sınıfı, farklı kullanıcıların üzerinde çalışabilmesi için akıllıca ayrı dosyalara bölebilseniz de, bunun yerine ayrı sınıflara bölemez misiniz?


+1, "bunun yerine ayrı sınıflara bölemez misiniz?". Bu tam olarak önerdiğimiz şey. Başlangıçta bu şekilde yapılması gereken sağduyulu gibi görünüyor.
Joshua Smith,

4

Sonunda, herhangi bir OOP parçası olmadan normal prosedürel gelişim yapıyorlar. Tüm metodlar, değişkenler ve hiçbir şey içermeyen bir küresel isim alanına sahiptirler.

Ya onları yanlış yaptıklarına ikna edin ya da oradan çekil.


1

Bir yardımcı sınıf, bir sınıf oluşturmak için duyarlı bir şekilde diğer yöntemlerle birleştirilemeyen yöntemler içerir. 135 dosyaya bölünmüş 800+ yönteminiz varsa, muhtemelen bazı ortak yöntemler bulmayı başarabilmiş gibi görünüyor ...

Sırf bir yardımcı sınıfınız olduğu için, başka bir yardımcı sınıfınız olamayacağı anlamına gelmez.

800 çoğunlukla ilgisiz yönteminiz olsa bile, çözüm büyük bir sınıf ve çok fazla dosya değildir. Çözüm, bir ad alanı, bazı alt ad alanları ve birçok küçük sınıf. Bu biraz daha fazla iş (sınıfın yanı sıra yöntem için bir ad bulmanız gerekiyor). Ancak bu karışıklığı temizleme zamanı geldiğinde hayatınızı kolaylaştıracak ve bu arada intellisense'in kullanımını kolaylaştıracak (yani bir yöntemin nerede kullanılacağını keşfetmek daha kolay).

Ve hayır, bu yaygın değildir (ücretsiz işlev sayısından daha fazla dosya sayısı).


0

Bundan hiç hoşlanmadım. Ancak, belki de kısmi sınıflar geliştirme sırasında geliştiricilere anlamlı geldi, çünkü bu aralarında çok fazla bağımlılık yoksa, bu çok sayıda yöntemin eşzamanlı olarak geliştirilmesine izin verdi.

Başka bir olasılık, bu kısmi sınıfların otomatik olarak oluşturulan bir çekirdek sınıfı değiştirmek için inşa edilmiş olmalarıdır. Bu durumda, bunlara dokunulmaması gerekir, aksi takdirde yeniden üretilirken özel kod kırılır.

Bir kimsenin bir araştırma yapmadan rahatlıkla bunu devam ettirebileceğinden emin değilim. Şimdi onu öldürürseniz, yöntem sayısı düşmeyecektir. Bana göre yöntemlerin ve karmaşıklıkların sayısı asıl sorun. Metotlar gerçekten sınıfa aitse, o zaman 1 büyük dosyaya sahip olmak hayatınızı kolaylaştıracak, özellikle bakımda, aslında, joker arama gibi aptalca hatalar için tüm bu kodları ortaya çıkarmaya daha yatkın olabilir. ve değiştirin.

Bu yüzden dikkatli olun ve öldürme kararını haklı çıkarın. Ayrıca, hangi testlerin gerekli olacağını düşünün.


0

135 dosyanın aslında geleneksel sınıfların yapabileceklerine benzer yöntemleri bir araya getirdiğini varsayarsak, pratik tasarım perspektifinden gayet iyi. Dosya başına yalnızca ortalama 6 yöntem. Bir projeyi tasarlamanın kesinlikle en popüler veya geleneksel yolu değil. Değişmeye çalışmak sadece bir sürü sorun yaratacak ve gerçek bir yararı olmayacak. Projenin OO standartlarına uygun hale getirilmesi, çözdüğü kadar sorun yaratacaktır. Birden fazla dosyanın gerçekten anlamlı bir ayrım yapmaması tamamen farklı bir konudur.


3
Prosedürel kodun OO'ya yeniden dönüştürülmesi genellikle bu problemi doğuruyor - Bence bunu düzeltmenin çok büyük bir görev olacağını ve ekibe düzgün sarılmayı bile uygun şekilde kodlamayı öğretiyor, bunun üzerine Joshua'nın gelecek yıl (ve sonrasında gerçekleşecek her şey için suçlanacağını düşünüyorum) (eğer onları refaktöre ikna ederse). İşte bu yüzden hiç kimse böyle refactor yapmak için çok fazla zorlamaz (en azından bir kez sonuçları gördükten sonra). Ayrıca, bunun iyi bir tasarım olduğunu düşünüyorsanız - bu cevabı 5 yıl içinde tekrar gözden geçirin ve ne düşündüğünüzü bize bildirin (Her 5 yılda bir tasarım hakkında bildiğim her şeyi yeniden öğrendim gibi görünüyor).
Bill K

@BillK on yıl beklerseniz bildiğiniz şey muhtemelen "tasarım" felsefesinde güncel olacaktır.
Ryathal

135 dosya genellikle ilgili yöntemleri gruplandırıyor, ancak bu (benim için) yine de bunu iyi bir fikir yapmıyor. Bu sistemi test altına almak istiyorum ancak 800 metodun hydra'sının inatçı / alaycı kıçında çirkin bir acı olacak.
Joshua Smith,

@Rhalhal, "içinde" olan şey değil, iyi bir tasarım olduğunu düşündüğünüz şeydir (iyi nedenlerden dolayı) ve sonra, pratiğiniz ve geliştirdiğiniz gibi, düşündüğünüz kadar iyi bir fikir olmadığını anlarsınız. Görünüşe göre her 5 yılda bir oluyor ve bir kere bazı insanların yorumlarına verdiğim yanıtı bozduğumu fark ettim çünkü onların uygulamalarımızı sonsuza dek geliştirme sürecinde olan (hepimiz gibi) mükemmel tasarımcılar olduklarını fark ediyorum. Endişelendiğim tek programcı 5 yıl önce yazdıkları kodu iyileştirebileceklerini düşünmeyen kişi.
Bill K,

0

Önceden işaret edilen cevapların ötesinde, kısmi sınıflar, sınıf hiyerarşinizi ayrı bir katmana özgü dosyalara ayıran işlevselliği düzenlemek istediğiniz katmanlı bir tasarımda yararlı olabilir. Bu, kişi başına işlevsellikte (dosya organizasyonu tarafından) gezinmek için çözüm kaşifini ve sınıf başına işlevsellikte gezinmek için sınıf görünümünü kullanmanıza olanak sağlar. Karışımları ve / veya özellikleri destekleyen bir dili kullanmayı tercih ederim, ancak kısmi sınıflar az kullanılırsa makul bir alternatiftir ve iyi bir sınıf hiyerarşi tasarımının yerine geçmemelidir.

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.