Ezici kodu yönetilebilir parçalara ayırmanın en iyi yolu?


13

Belli bir karmaşıklık seviyesine ulaştıklarında, büyük projeler tarafından sürekli bunalıyorum. Bir projede belirli bir noktaya geldiğimde, ilerlemem yavaş yavaş ilerler ve kendimi sürekli adımımı geri çekerken ve her türlü karışıklığı çözerken bulurum.

Bu zayıflığım nedeniyle yeniden düzenleme konusunda gerçekten iyi oldum. Ve her zaman nesnelerimi daha küçük, daha yönetilebilir olanlara ayırmaya çalışıyorum. Bu zayıflık muhtemelen işleri düzgün bir şekilde tasarlamaya çok fazla dikkat etmeme neden oldu.

Sorunlarımı daha küçük olanlara ayırabilirsem, sorunsuz bir şekilde başarabilirim. Akla gelen bir strateji, test odaklı geliştirmedir. Başka ne yapabilirim?


2
"Nesnelerimi her zaman daha küçük, daha yönetilebilir olanlara ayırmaya çalışırım" ve "Sorunlarımı daha küçük olanlara ayırabilir miyim, sorunsuz bir şekilde başarabilirim" sorunuzu biraz retorik yapalım.
Morgan Herlocker

2
Okuma Refactoring (Fowler) ve Tasarım Kalıpları (GoF) . Bu soru gerçekten "Kodu nasıl yapılandırabilirim?" ve eğer soruyorsanız, seyahat etmek için uzun bir yolunuz var ; orada yarı yolda bile vermek için tek bir soru-cevap iplik güvenmeyin.
Aaronaught

Yanıtlar:


13

kodu düşünmeyi bırak

katmanlar, özellikler, modüller, hizmetler ve diğer üst düzey soyutlamalar hakkında düşünmeye başlayın

bunalmış oluyorsunuz çünkü çok düşük bir seviyede düşünüyorsunuz


9

Kompleksi basitleştirmek kolaydır ; bekle başka bir yol olduğunu düşünüyorum.

Herkes bununla mücadele ediyor, aşırı etkililiği olan basit bir çözüm yok.

Bunu sorularınızda listelemediğiniz için önerim:

Aşağıdakiler yoluyla fonksiyonel bütünlüğe odaklanın :

Tek sorumluluk ilkesi , her nesnenin tek bir sorumluluğa sahip olması ve bu sorumluluğun tamamen sınıf tarafından kapsüllenmesi gerektiğini belirtir. Tüm hizmetleri bu sorumlulukla dar bir şekilde uyumlu olmalıdır.

Eğer varsa Google'dan ilk sayfada sonuçları arasında iki büyük kaynaklar bulacaksınız:

  • Robert C. Martin tarafından " Tek Sorumluluk İlkesi " (Şubat / 2002): Bu ilke, değişen nedenlerden dolayı değişen şeyleri farklı sınıflara yerleştirme ihtiyacını tartışır.
  • Jeff Atwood'un " Kıvırcık Yasası: Bir Şey Yapın " (Mar / 2007): Tek Sorumluluk İlkesi, bir sınıfın değiştirmek için bir ve sadece bir sebebi olması gerektiğini söylüyor.

Bilgisayar bilimlerinde uyum nedir?

Uyum , tek bir modülün sorumluluklarının ne kadar güçlü ilişkili veya odaklanmış olduğunun bir ölçüsüdür. Nesne yönelimli programlamaya uygulandığı gibi, verilen sınıfa hizmet eden yöntemlerin birçok yönden benzer olma eğiliminde olması durumunda, sınıfın yüksek bütünlüğe sahip olduğu söylenir. Oldukça uyumlu bir sistemde, kod okunabilirliği ve yeniden kullanım olasılığı artarken, karmaşıklık yönetilebilir tutulur.

Kohezyon aşağıdaki durumlarda azalır : - Bir sınıfa gömülü olan ve yöntemleriyle erişilen işlevlerin pek az ortak noktası vardır. - Yöntemler, genellikle kaba taneli veya ilgisiz veri kümeleri kullanan birçok farklı aktivite yürütür.

Düşük kohezyonun (veya “zayıf kohezyon”) dezavantajları şunlardır: - Modülleri anlamada artan zorluk. - Etki alanındaki mantıksal değişiklikler birden çok modülü etkilediği ve bir modüldeki değişikliklerin ilgili modüllerde değişiklik gerektirdiği için bir sistemin bakımında artan zorluk. - Çoğu uygulama bir modül tarafından sağlanan rasgele işlem setine ihtiyaç duymayacağından, bir modülü tekrar kullanmada artan zorluk.

Herhangi bir sorunuz varsa bize bildirin.


1

Özellikleri mümkün olan en küçük öğeye ayırın. Örneğin, formdaki tek bir alan. En riskli veya yüksek öncelikli olanı seçin ve büyük bir proje değil, basit bir hata düzeltmesi gibi ilerleyin. Daha sonra bazı yeniden düzenleme ile sonuçlanacağınız doğrudur, ancak en azından ilerleyeceksiniz.


1

Tecrübelerime göre, TDD hakkındaki yorumla kendi sorunuzu cevapladınız. Benim için sık sık seninle aynı şeyi hissettim, erken hızlı başarı, sistem belirli bir boyuta ulaştığında hızlı bir şekilde küçük ayrıntılara saplanmaya dönüştü. TDD ile bunun yardımcı olduğunu buldum, çünkü sistemin geri kalan kısmının bıraktığınız gibi çalışmaya devam edeceğini veya devam etmesi gerektiğini bilerek, sistemin her bir parçasını küçük parçalar olarak ele alabilirsiniz. Ayrıca, TDD ile sisteminizin açıkça bağımsız olarak test edilebilen daha küçük parçalara ayrıldığından emin olmanıza yardımcı olur.


0

Bazı insanlar modüler, kolayca anlaşılabilir programlar tasarlamakta iyidir, ancak programcıların çoğunluğu bu tesisten daha az veya daha fazla ölçüde yoksundur. Muhtemelen çok fazla deneyim dışında, ilk tip programcılardan birini ikinciye çevirebilecek hiçbir kitap, prosedür veya uygulama bilmiyorum . Ama bundan bile emin değilim.

Sonuç olarak, çoğu programcı vasatın üzerine çıkmak için mücadele edecek, birkaç kişi tamam olmayı başaracak (ki kendimi ve belki de IB endüstrisindeki profesyonel programcıların% 50'sini yerleştireceğim) ve çok küçük azınlık mükemmel olacak. Ben uzun kariyerimde bu mükemmel olanlardan biriyle tanışmadım demeliyim :-)


2
Nereden geldiğini görüyorum ve bir parçam seninle aynı fikirde, ama yardım edemem ama bunun biraz yenilgi olduğunu hissediyorum. Evet, kötü bir programcıyı iyi bir programa dönüştürecek sihirli bir hap yoktur, ancak deneyim yoluyla, hedefe yönelik öğrenme ve yapılan işin iyileştirilmesinin dürüst değerlendirilmesi gerçekleşir. Platonun ne kadar hızlı ve nerede olduğu bireye bağlıdır, ancak bence çok şey motivasyon ile ilgilidir.

1
Bir İnek 1 @Telefon Ağız: Kabul ve yapar Peter Norvig "mükemmel" bir programcı olduğunu Araştırma Google'ın Direktörü: Yourself On Yıllık Programlama Teach
gaflar

1
@blunders - iyi bir makale. Pazarlama adamlarının bize söylemek istemediği kirli küçük sır (elbette Sega hariç). Uygulama, uygulama, uygulama. Sözde Japonca için çalışıyor alljapaneseallthetime.com/blog

Bazı geliştiricilerin "tasarım kör" oldukları ve büyük, düzenli yönetilebilir sistemler tasarlayamadıkları sonucuna vardı. Eğer tasarım körseniz, hiçbir şey size yardımcı olmaz. GOF Tasarım Desenleri kitabı, iyi bir tasarım görmemiş, ancak çok sayıda kod yazmış bir programcıya yardımcı olabilir.
Tim Williscroft

0

Bence birçok insan çözümlere aşırı mühendislik yapmaya çalışıyor. Biraz daha pratik olanların işleri büyük ölçüde basitleştireceği zaman "Adam & Eve" yaklaşımını kullanıyorlar.

Uzmanlaşmış sınıflar kötü değildir, sağlam yazılım tasarımının doğal sonucudur.

Bence birçok programcı bunu anlayamıyor ve bildiğim hiçbir kitap yok.

Kesinlikle yardımcı olan bir başka şey de, uygulamayı pratikte nasıl kullanacağınızı ve birçok durumda günü kurtarabileceğinizi "anlayabilmenizi" sağlayan TDD'dir, çünkü günün erken saatlerinde ortaya çıkan sorunları / sınırlamaları gösterir.

Son olarak, ben olsaydım aradığım ÇOK önemli bir şey tasarım desenleri. Tasarım kalıpları, sizden veya benden daha akıllı insanların programlama sorunlarını nasıl çözdüğüdür. Kalıpların arkasındaki fikir, tahmin edin ne ?, sadece orada çarptığınız yemek kitapları, yemek tarifleri olarak değil, düşünceli olarak ve her şeyden önce uygulama alanınızı anlamak için kullanılmalarıdır.

Desenin akıllıca kullanılması, yönetmeniz gereken ayrıntıların miktarını büyük ölçüde azaltacaktır.

İhtiyaçlarınıza göre tasarlanmış iyi bir tasarım deseni kütüphanesi paha biçilmez olacaktır. Sadece bir şeyleri bağlama koymak için çok basit bir örnek görelim:

bir düğmeye basıldığında diğer formların kendilerini güncellemesi gereken bir formunuz olduğunu düşünün. Bu tipik bir "gözlemci" örüntüsüdür. Bir özneniz ve bunları özneyle özdeşleştiren birkaç gözlemciniz var. Neden bir arayüz uygulamanız gerekiyor? Sadece yöntemleri ekleyebilir veya daha iyisi, gözlemciler için bir arayüz ve konu için genel bir liste kullanabilirsiniz. Şimdi her iki dünyanın da en iyisini elde ettiniz: gözlemciler için bağımsızlık ve konuyla ilgili çok çılgınca şeyler yok.

Umarım sizin için mantıklıdır!

Andrea


Bu arada, sadece açıklığa kavuşturmak için: Ben gremlinler gibi büyüyen vahşi sınıfları savunmuyorum, daha ziyade bir tidbit daha pratik bir anlam :)
Andrea Raimondi

0

Soyutlama ihtiyacını göz ardı ettiğimizde dev hızı ve okunabilirliği sorunu ortaya çıkabilir. Çalıştığım bazı büyük kod tabanlarında, en yaygın tek düşman, kodun şişmesine neden olan çok benzer işlevselliklere sahip olan on beş özel uzmanlık sınıfıdır. Bir adım geri atarsak ve uygulamanın bir parçası olarak gereksinimleri bir bütün olarak anlarsak, aklımıza birçok soyutlama gelir.

Bana yardımcı olan bazı basit adımlar

  • Kod tabanındaki yinelenen kod bloklarını bulmak için benzerlik analizörünü (Simian gibi) kullanın. Birçok yinelenen kod daha az soyutlama anlamına gelir.
  • Sınıfların ve yöntemlerin büyüklüğünü izleyin, büyük sınıflar ve yöntemler az sayıda hizmet veya denetleyicinin tanrı haline geldiği anlamına gelir.
  • Birim / entegrasyon testlerini zorunlu hale getirin, size refactor'a güven verir ve aynı zamanda bir spesifikasyon görevi görür.
  • İşletme / teknik / işletme / alan adı terimlerinin sınıf isimlerine yansıtılıp yansıtılmadığını anlamak için işletme ile iki hafta geriye dönük olarak bakılır. Bu, basit kümeler ve listeler olarak göstermek yerine birinci sınıf koleksiyonlar için adların anlaşılmasına ve alınmasına yardımcı olur. Hiç düşünmediğimiz bazı soyutlamalar da iş adamları ile oturduğumuzda ortaya çıkacak.

bu da benim savunduğum şeyle ilgili. Bence soyutlama ve uzmanlık arasında bir denge olmalı: çok fazla uzmanlık çok fazla soyutlama kadar kötü.
Andrea Raimondi
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.