Herhangi bir kod yazmadan önce bir uygulamanın mimarisini nasıl planlıyorsunuz? [kapalı]


84

Mücadele ettiğim bir şey, herhangi bir kod yazmadan önce bir uygulamanın mimarisini planlamak.

Uygulamanın yapması gerekenleri daraltmak için gereksinimleri toplamayı kastetmiyorum, bunun yerine genel sınıfı, verileri ve akış yapılarını düzenlemenin iyi bir yolunu etkili bir şekilde düşünmeyi ve bu düşünceleri yineleyerek güvenilir bir planım olmasını kastetmiyorum. IDE'yi açmadan önce aklınızda bulundurun. Şu anda sadece IDE'yi açmak, boş bir proje oluşturmak, bit ve bob yazmaya başlamak ve tasarımın oradan 'büyümesine' izin vermek çok kolay.

UML'nin bunu yapmanın bir yolu olduğunu anlıyorum, ancak onunla hiç deneyimim yok, bu yüzden biraz belirsiz görünüyor.

Nasıl mı sen herhangi bir kod yazmadan önce bir uygulamanın mimarisini planı? UML gitmenin yolu ise, ufak tefek uygulamalar geliştiricisi için kısa ve pratik bir giriş önerebilir misiniz?

Görüşünüzü takdir ediyorum.

Yanıtlar:


32

Kağıda veya beyaz tahtaya ilk kez yazmanın gerçekten çok önemli olduğunu düşünüyorum. Sonra isterseniz UML'ye geçin, ancak hiçbir şey ilk başta onu elle çizmenin esnekliğini yenemez.


30
Beyaz tahtaya süper güvenli "SİLMEYİN" ibaresini koyduğunuzdan emin olun. :)
MusiGenesis

1
İlk tasarım için beyaz tahtayı ve kağıdı gerçekten yenemezsiniz. Kolay, esnek ve etkileyici.
Booji Boy

3
Beyaz tahtayı kullandıktan sonra lamine edebilirsiniz ...: P
Patrick

41

Aşağıdakileri düşünüyorum:

  1. sistemin ne yapması gerekiyor, yani sistemin çözmeye çalıştığı problem nedir
  2. müşteri kim ve istekleri neler
  3. sistemin neyle entegre olması gerekiyor
  4. Dikkate alınması gereken eski yönler var mı
  5. kullanıcı etkileşimleri nelerdir
  6. vb...

Sonra sisteme kara kutu olarak bakmaya başladım ve:

  1. bu kara kutu ile olması gereken etkileşimler neler
  2. Kara kutunun içinde olması gereken davranışlar nelerdir, yani kara kutunun istenen davranışı daha yüksek bir seviyede sergilemesi için bu etkileşimlere ne olması gerekir, örneğin bir rezervasyon sisteminden gelen mesajları alma ve işleme, bir veritabanını güncelleme vb. .

Daha sonra bu size, her biri aynı şekilde daha da bölünebilen çeşitli dahili kara kutulardan oluşan sistemin bir görünümünü vermeye başlayacaktır.

UML, bu tür davranışları temsil etmek için çok iyidir. Çoğu sistemi UML'nin birçok bileşeninden ikisini kullanarak tanımlayabilirsiniz, yani:

  • sınıf diyagramları ve
  • dizi diyagramları.

Davranışta açıklanması gereken herhangi bir paralellik varsa, aktivite diyagramlarına da ihtiyacınız olabilir.

UML'yi öğrenmek için iyi bir kaynak, Martin Fowler'in mükemmel kitabı "UML Distilled" dir ( Amazon bağlantısı - dışarıdaki kiddie link nazis komut dosyası için sterilize edilmiştir (-:). Bu kitap, bileşenlerin her birinin temel parçalarına UML.

Oh. Açıkladığım şey, hemen hemen Ivar Jacobson'ın yaklaşımıdır. Jacobson, OO'nun Üç Kafadarından biridir. Aslında UML başlangıçta Üç Kafadar, Grady Booch ve Jim Rumbaugh'u oluşturan diğer iki kişi tarafından geliştirildi.


18

Steve McConnell's Code Complete'e ve özellikle "Tasarımda Tasarım" konulu hediye bölümüne kesinlikle bir göz atmalısınız.

Web sitesinden indirebilirsiniz:

http://cc2e.com/File.ashx?cid=336


Çok iyi bir okuma - birçok iyi bilgi, tavsiye ve fikir. Çok uzun da değil.
Booji Boy

Kitabı satın alın ve bireysel sınıfların tasarımıyla ilgili 6. bölümü de okuyun. Sonra diğer tüm bölümleri de okuyun - saf altındır.
MarkJ

Oh evet, bölüm 4 uygulama mimarisi hakkındadır
MarkJ

Bu sektörde ciddi bir şeyler yapıyormuş gibi davranan herkes, oynayacakları rol ne olursa olsun, o kitabı kesinlikle okumalı.
Chepech


8

Bunu, çoğunlukla mimarinin çoğunun önceden kararlaştırıldığı (WebForms, şimdi MVC) web geliştirme yaptığımı ve projelerimin çoğunun oldukça küçük, tek kişilik çabalar olduğunu ve bir yıldan daha az zaman aldığını söyleyerek başlayacağım. Ayrıca, iş nesnemi ve veri etkileşimimi yönetmek için sırasıyla bir ORM ve DAL'a sahip olacağımı da biliyorum. Son zamanlarda, bunun için LINQ kullanmaya geçtim, "tasarımın" çoğu, DBML tasarımcısı aracılığıyla veritabanı tasarımı ve eşleme haline geldi.

Tipik olarak, TDD (test güdümlü geliştirme) tarzında çalışıyorum. Mimari veya tasarım detayları üzerinde çalışmaya çok fazla zaman ayırmıyorum. Kullanıcının uygulama ile genel etkileşimini hikayeler aracılığıyla topluyorum. Hikayeleri etkileşim tasarımını çözmek ve uygulamanın ana bileşenlerini keşfetmek için kullanıyorum. Bu işlem sırasında müşteriyle çok sayıda beyaz tahta yapıyorum - bazen diyagram biçiminde tutacak kadar önemli görünüyorsa, ayrıntıları dijital bir kamerayla yakalıyorum. Esas olarak hikayelerim bir wikide hikaye biçiminde yakalanır. Sonunda, hikayeler sürümler ve yinelemeler halinde düzenlenir.

Bu zamana kadar genellikle mimari hakkında oldukça iyi bir fikrim var. Karmaşıksa veya alışılmadık bitler varsa - normal uygulamalarımdan farklı şeyler - veya başka biriyle çalışıyorsam (tipik değil), şeyleri çizerim (yine bir beyaz tahtada). Aynısı karmaşık etkileşimler için de geçerlidir - sayfa düzenini ve akışını bir beyaz tahtada tasarlayabilir, bu bölümü bitirene kadar (veya kamera ile çekim yaparak) kullanabilirim. Nereye gittiğim ve ilk önce ne yapılması gerektiği konusunda genel bir fikrim olduğunda, ilk hikayeler için testler yazmaya başlayacağım. Genellikle bu şöyle olur: "Tamam, bunu yapmak için bu sınıflara ihtiyacım olacak. Bununla başlayacağım ve bunu yapması gerekiyor." Sonra neşeyle TDDing yapmaya başladım ve mimari / tasarım, uygulamanın ihtiyaçlarından büyüyor.

Periyodik olarak, kendimi bazı kod parçalarını tekrar yazmak isterken veya "bu gerçekten kokuyor" diye düşünürken bulacağım ve çoğaltmayı kaldırmak veya kokulu bitleri daha zarif bir şeyle değiştirmek için tasarımımı yeniden düzenleyeceğim. Çoğunlukla, iyi tasarım ilkelerini izlerken işlevselliği azaltmakla ilgileniyorum. Bilinen kalıpları kullanmanın ve ilerledikçe iyi ilkelere dikkat etmenin oldukça iyi sonuç verdiğini görüyorum.



4

UML bir gösterimdir. Tasarımınızı kaydetmenin bir yolu, ancak (bence) tasarım yapmanın bir yolu değil. Eğer bir şeyler yazmanız gerekiyorsa, UML'yi tavsiye ederim, çünkü "en iyisi" değil, başkalarının muhtemelen okumayı bildiği bir standart ve kendi "standardınızı" icat etmekten daha iyi.

Sanırım UML'ye en iyi giriş , Martin Fowler'ın yazdığı UML Distilled'dir , çünkü özlüdür, nerede kullanılacağı konusunda pratik rehberlik sağlar ve tüm UML / RUP hikayesini satın almanız gerekmediğini açıkça ortaya koyar. Bir işe yara

Tasarım yapmak zordur ve tek bir StackOverflow cevabında ele alınamaz. Ne yazık ki, tasarım becerilerim yıllar içinde gelişti ve bu yüzden sizi yönlendirebileceğim tek bir kaynağım yok.

Bununla birlikte, yararlı bulduğum bir model, sağlamlık analizidir (bunun için google, ancak burada bir giriş var ). Sistemin ne yapması gerektiğine dair kullanım durumlarınız varsa, nelerin dahil olduğuna dair bir etki alanı modeliniz varsa, sağlamlık analizini ikisini birbirine bağlamak ve sistemin temel bileşenlerinin ne olması gerektiğini bulmak için yararlı bir araç buldum. .

Ancak en iyi tavsiye geniş çapta okunur, çok düşünülür ve pratik yapılır. Tamamen öğretilebilir bir beceri değil, bunu gerçekten yapmalısınız.


4

Biraz daha ileriyi planlayacak kadar akıllı değilim. Önceden plan yaptığımda, planlarım her zaman yanlış çıkıyor, ama şimdi kötü planlar için n gün geçiriyorum . Tahtada sınırım yaklaşık 15 dakika gibi görünüyor.

Temel olarak, doğru yöne gidip gitmediğimi anlamak için elimden geldiğince az çalışıyorum.

Tasarımıma kritik sorular için bakıyorum: A, B'den C'ye ne zaman, D için yeterince hızlı olacak mı? Değilse, farklı bir tasarıma ihtiyacımız var. Bu soruların her biri ani bir artışla yanıtlanabilir. Sivri uçlar iyi görünüyorsa, o zaman tasarıma sahibiz ve onu genişletme zamanı.

Mümkün olan en kısa sürede gerçek bir müşteri değeri elde etme yönünde kodluyorum, böylece bir müşteri bana nereye gitmem gerektiğini söyleyebilir.

Her zaman bir şeyleri yanlış anladığım için, onları doğru yapmama yardımcı olması için yeniden düzenlemeye güveniyorum. Yeniden düzenleme risklidir, bu nedenle, ilerledikçe birim testleri yazmam gerekiyor. Sonrasında birim testleri yazmak eşleştirme nedeniyle zor, bu yüzden önce testleri yazıyorum. Bu konuda disiplinli kalmak zor ve farklı bir beyin olayları farklı görüyor, bu yüzden benimle kodlama yapan bir arkadaşım olmasını seviyorum. Kodlama arkadaşımın burnu var, bu yüzden düzenli olarak duş alıyorum.

Buna "Ekstrem Programlama" diyelim.


1
Muhtemelen 15 dakikadan biraz fazla zaman geçirdim ama cevabınız benimle titreşiyor. Tasarım konusunda yanılmayı göze alamayacağımı hissediyorum, bu yüzden zaman içinde işe yaradığı kanıtlanmış geniş vuruşlarla tasarım yapıyorum. O zaman her türlü tutarsızlığı halledebilirim.
steviesama

Orada ne yaptığını görüyorum
hitch


3

Hiçbir şeyin olabileceğine ikna olmadımuygulamadan önce önceden planlanmalıdır. 10 yıllık tecrübem var, ancak bu sadece 4 şirkette (bir şirkette neredeyse birbirine zıt olan 2 site dahil) ve neredeyse tüm deneyimlerim devasa kümeyi izlemekle ilgiliydi ****** ** s meydana gelir. Yeniden düzenleme gibi şeylerin işleri yapmanın en iyi yolu olduğunu düşünmeye başladım, ama aynı zamanda deneyimlerimin sınırlı olduğunu fark ettim ve gördüklerime tepki veriyor olabilirim. Gerçekten bilmek istediğim şey, en iyi deneyimin nasıl elde edileceğidir, bu yüzden doğru sonuçlara varabilirim, ancak kısayol yok gibi görünüyor ve insanların bir şeyleri yanlış yaptığını görmek çok zaman alıyor :(. I İnsanların işleri doğru yaptığı bir şirkette çalışmaya gerçekten bir şans vermek isterdim (başarılı ürün dağıtımlarıyla kanıtlandığı üzere),


2

Farklı olmak için yalvarıyorum: UML, uygulama mimarisi için kullanılabilir, ancak daha çok teknik mimari (çerçeveler, sınıf veya sıra diyagramları, ...) için kullanılır, çünkü burası, bu diyagramların geliştirme ile en kolay şekilde senkronize tutulabileceği yerdir. .

Uygulama Mimarisi , (gelecekteki bir uygulama hakkında herhangi bir varsayımda bulunmadan işlemlerin doğasını ve akışlarını tanımlayan) bazı işlevsel özellikleri aldığınızda ve bunları teknik şartnamelere dönüştürdüğünüzde ortaya çıkar.

Bu özellikler temsil uygulamalar için ihtiyaç uygulayan bazı iş ve fonksiyonel ihtiyaçlarını.

Bu nedenle, birkaç büyük finansal portföyü işlemeniz gerekiyorsa (fonksiyonel özellikler), bu büyük spesifikasyonu aşağıdakilere bölmeniz gerektiğini belirleyebilirsiniz:

  • Bu ağır hesaplamaları farklı sunuculara atamak için bir dağıtım görevlisi
  • bu portföyleri işlemeye başlamadan önce tüm hesaplama sunucularının çalışır durumda olduğundan emin olmak için bir başlatıcı.
  • neler olduğunu gösterebilmek için bir GUI.
  • birim testini kolaylaştırmak için uygulama mimarisinin geri kalanından bağımsız olarak özel portföy algoritmalarını geliştirmek için "ortak" bir bileşen, aynı zamanda bazı işlevsel ve regresyon testleri.

Yani temelde, uygulama mimarisi hakkında düşünmek, tutarlı bir şekilde hangi "dosya grubunu" geliştirmeniz gerektiğine karar vermektir (aynı dosya grubunda bir başlatıcı, bir GUI, bir dağıtıcı, ...: onlar aynı hızda gelişemezdi)

Bir uygulama mimarisi iyi tanımlandığında, bileşenlerinin her biri genellikle bir yapılandırma bileşeni için iyi bir adaydır , yani tümü bir VCS'ye (Sürüm Kontrol Sistemi) sürümlendirilebilen bir dosya grubudur, yani tüm dosyaları o uygulamanın anlık görüntüsünü her kaydetmeniz gerektiğinde birlikte etiketlenir (yine, tüm sisteminizi etiketlemek zor olur , her bir uygulaması aynı anda kararlı durumda olamaz)


2

Bir süredir mimarlık yapıyorum. Önce iş sürecini iyileştirmek için BPML kullanıyorum ve ardından çeşitli ayrıntıları yakalamak için UML kullanıyorum! Üçüncü adım genellikle ERD'dir! BPML ve UML ile işiniz bittiğinde ERD'niz oldukça kararlı olacaktır! Hiçbir plan mükemmel değildir ve hiçbir soyutlama% 100 olmayacaktır. Yeniden düzenleme planlayın, amaç yeniden düzenlemeyi mümkün olduğunca en aza indirmektir!


1

Düşüncelerimi iki alana ayırmaya çalışıyorum: manipüle etmeye çalıştığım şeylerin ve onlarla ne yapmak istediğimin temsili.

Manipüle etmeye çalıştığım şeyi modellemeye çalışırken, bir dizi ayrı öğe tanımı buluyorum - bir e-ticaret sitesinde bir SKU, bir ürün, bir müşteri vb. Olacak. Ayrıca üzerinde çalıştığım bazı maddi olmayan şeylere de sahip olacağım - bir sipariş veya bir kategori. Sistemde tüm "isimler" e sahip olduğumda, bu nesnelerin birbirleriyle nasıl ilişkili olduğunu gösteren bir etki alanı modeli oluşturacağım - bir siparişin bir müşterisi ve birden çok SKU'su var, birçok SKU bir ürün olarak gruplandırılıyor ve üzerinde.

Bu alan modelleri, UML alan modelleri, sınıf diyagramları ve SQL ERD'ler olarak temsil edilebilir.

Sistemin isimlerini anladıktan sonra, fiillere geçiyorum - örneğin, bu öğelerin her birinin bir emir vermek için gerçekleştirdiği işlemler. Bunlar genellikle işlevsel gereksinimlerimden gelen vakaları kullanmak için oldukça iyi eşlenir - bulduğum bunları ifade etmenin en kolay yolu UML dizisi, aktivite veya işbirliği diyagramları veya kulvar diyagramları.

Bunu yinelemeli bir süreç olarak düşünmek önemlidir; Alanın küçük bir köşesini yapacağım ve ardından eylemler üzerinde çalışacağım ve sonra geri döneceğim. İdeal olarak, ilerledikçe bazı şeyleri denemek için kod yazmak için zamanım olacak - tasarımın uygulamadan çok ileriye gitmesini asla istemezsiniz. Her şey için eksiksiz ve nihai mimariyi inşa ettiğinizi düşünüyorsanız, bu süreç genellikle korkunçtur; gerçekten, tek yapmaya çalıştığınız, geliştirme boyunca ilerledikçe ekibin ortak paylaşacağı temel temelleri oluşturmak. Çoğunlukla ekip üyelerinin sistemi tanımlarken kullanmaları için ortak bir kelime hazinesi oluşturuyorsunuz, nasıl yapılması gerektiğine dair kanunu ortaya koymuyorsunuz.


1

Bir sistemi kodlamadan önce tamamen düşünmekte zorlanıyorum. Sadece daha sonra farkına vardığınız bazı bileşenlere, düşündüğünüzden çok daha karmaşık olduğunu sadece üstünkörü bir bakış getirmek çok kolaydır.

Çözümlerden biri, gerçekten çok çabalamaktır. Her yere UML yazın. Her dersi gözden geçirin. Diğer sınıflarınızla nasıl etkileşime gireceğini düşünün. Bunu yapmak zordur.

Yapmaktan hoşlandığım şey ilk başta genel bir bakış yapmaktır. UML'yi sevmiyorum, ancak noktayı aşan diyagramlar çizmeyi seviyorum. Sonra uygulamaya başladım. Sınıf yapısını boş yöntemlerle yazarken bile, genellikle daha önce kaçırdığım şeyleri görüyorum, bu yüzden tasarımımı güncelliyorum. Kod yazarken farklı bir şey yapmam gerektiğini fark edeceğim, bu yüzden tasarımımı güncelleyeceğim. Bu bir var tekrarlanan bir süreçtir . "Önce her şeyi tasarlayın ve sonra hepsini uygulayın" kavramı şelale modeli olarak biliniyor ve bence diğerleri bunun yazılım yapmanın kötü bir yolu olduğunu gösterdi.


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.