Kod genel olarak UML'den üretiliyor mu? [kapalı]


39

Bu yüzden üniversitedeyken UML'nin yararı ve kod geliştirme konusundaki geleceği hakkında eğitim aldım.

Ancak sektör tecrübelerime göre şemaları kullanırken - ER şemalarından, sınıf şemalarından, durum şemalarından iş akış şemalarına kadar - bunların iletişim amaçlı olduğunu gördüm.

Başka bir deyişle, kodları otomatik olarak diyagramlardan oluşturmadım ve bir iletişim açısından genel olarak diyagramlarımı olabildiğince basit ve anlaşılması kolay tutmaya çalışıyorum.

Ancak Visio ve Enterprise Architect’e baktığımda, çoğu kullanmadığım birçok farklı grafik, şekil, özellik nesnesi var gibi görünüyor.

İnsanlar kod veya veritabanı oluşturma gibi daha karmaşık şeyler yapmak için UML kullanıyor mu?


6
@SK - Kodunuzun müthiş olduğunu ve çok net olduğunu söyleyelim, 5 yaşındaki bir kişi bile tüm projenizi birkaç yöntemle okuyabilir. Bununla birlikte, doğaüstü kabiliyetli bir kod yazma yeteneğinize sahip olmayanlar için, diyagramlar sistemin nasıl başarılı bir şekilde çalıştığını ve UML Diyagramları bu diyagramları çizmenin standart bir yolunu tarif etmede büyük yarar sağlar. Onların en iyi yol olduğunu iddia etmiyorum, çoğu zaman işe yarayan standart bir yol.
Dunk

2
@Dunk, muhtemelen geri kalanımızın mağara resmi yerine bir konuşma icat ettiği zaman özlemiştiniz . Diyagramlar, neredeyse her zaman hiçbir şey değildir, neyi temsil etmeleri gerekiyorsa gizlemenin bir yoludur. Düz bir metin her zaman daha iyidir. Sisteminiz ne kadar büyük olursa, davranışı ne kadar karmaşıksa, mağara dönemi çağındaki iletişim tarzı ile modern İngiliz arasındaki bu boşluk o kadar büyüktür. Önce bir metne elle çevirmeden anlayabileceğim bir diyagram hiç görmedim.
SK-mantığı

9
@ SK-mantık - Bir resmin bin kelimeyle boyandığını sanıyordum?
Michael Arnell

5
@ SK-mantık: Metin yoluyla daha iyi iletilen bazı şeyler var. İster inanın ister inanmayın, diğerleri diyagramlarla daha iyi iletişim kurar ve bu sistem tasarımını içerir, sadece OO tasarımını içermez. Farklı insanlar için bile farklı olabilir ve hayır, metinsel bilgi tercihiniz tanrının verdiği bir üstünlük işareti değildir.
Michael Borgwardt

3
@Sk - Fikriniz bazı geçerli noktalara sahipken, tek başına bir diyagram olarak neredeyse hiçbir zaman yeterli değildir ve bazı metinlerin eklenmesi gerekir. Ben, işe yaramaz diyagramlar olduğuna inandığınız şeyleri kullanmaya devam ederken, büyük takımlarda neredeyse imkansız sürelere sahip oldukça büyük sistemler oluşturmaya devam ediyorum çünkü diğer geliştiricilerle daha iyi iletişim kurmayı daha iyi görmedim. Her geliştiriciye oturup ayrı ayrı rehberlik edecek çok zamanınız olduğunu biliyorum, ancak iş yapmak için çok meşgulüm.
Dunk

Yanıtlar:


64

Evet, UML CASE araçları 90'lı yılların en popüler ürünlerinden biriydi ... ve teslim edilemedi.

Bunun temel nedeni, UML (veya diğer birçok tür diyagram) diyagramının sorunu ve / veya bunu yalnızca diyagramda çözen programı anlamaya yardımcı olması ve gerçek kodun uygulama ayrıntılarını ortadan kaldırmasıdır . Bu nedenle (önemsiz herhangi bir kod parçası için), anlaşılması kolay bir diyagram kod oluşturmak için kullanışsızdır , çünkü gerekli ayrıntılara sahip değildir. Ve bunun tersi durumda, doğrudan kod oluşturma için kullanılabilen bir şema, programı kodun kendisinden daha iyi anlamanıza yardımcı olmaz . Üretim kodundan ters olarak tasarlanmış bir UML sınıf şeması gördüyseniz, muhtemelen ne demek istediğimi biliyorsunuzdur.

Bildiğim tek potansiyel istisna, yalnızca kendi kodunu içermeyen Varlık-İlişki diyagramlarıdır (sadece adlarının da ima ettiği gibi) veri parçaları ve ilişkileri. Ancak, test edilen ORM gibi özel amaçlı araçlar / alanlar dışında, gerçek kod üretimi için [Güncelleme] - yani sınıf iskeletlerinden ve alıcılar / ayarlayıcılar gibi önemsiz kodlardan daha fazla - herhangi bir UML diyagramını kullanma girişimi hiç duymadım Doc Brown tarafından [/ Güncelleme] altında , ve bunun bir kaza olmadığını düşünüyorum.

Şahsen UML'den nefret etmiyorum - UML diyagramlarının tasarım tartışmaları sırasında niyetinizi ve fikirlerinizi göstermek veya uygulamanızın mimarisini görselleştirmek için harika bir iletişim aracı olabileceğini düşünüyorum . Ancak onları bu konuda tutmak en iyisidir ve iyi olmadıkları şeyler için kullanmaya çalışmayın.


5
Kesinlikle. Ama sonra soru neden UML'nin bütünüyle anlamsızca katı kuralları ve ilk olarak UML'yi oluşturmak için kullandığı şişirilmiş araçlarıyla? Çizgiler ve oklarla birbirine bağlanan basit çokgenler ve elipsler, UML'de olduğu gibi, daha iyi olmasa da, iyi bir iş çıkarırlar.
Dexter,

1
90'lı yutturmaca için +1, Donanım tasarımı, aynı zamanda, ters yönde, şematik yakalamadan ve HDL'lere doğru ilerliyordu.
jk.

2
1996'dan 2002'ye kadar UML diyagramlarını "daha iyi" ER modelleri olarak başarıyla kullandığımız bir şirkette çalışıyordum. Tek bir modelden ORM framework, SQL / DDL ve dokümantasyon için C ++ kodu üretmek için kendi kod jeneratörlerimiz vardı.
Doktor Brown,

2
UML diyagramının büyük bir kullanımı da iskeledir. Alıcı / belirleyici, belki de dizin ağacınız, vb. İle sınıflar oluşturun
Clement Herreman 14:11

5
Şey izni o "çizgiler ve oklar ile bağlı Basit poligonları ve elips," dir: @Dexter çok yoruma açık. UML her şey için özel bir sembole sahip olmak için çok çalışıyor olabilir, ancak kesinlikle sınıflar ve donanım sistemleri arasında ve bir miras ilişkisi ile bir iletişim kanalı arasında görsel olarak ayırt etmenizi sağlayan standartlaştırılmış bir gösterime sahip olmanın değeri vardır.
Michael Borgwardt

36

Böylece, üniversitedeyken (bir süre önce), UML'nin geleceği olduğu söylendi, UML programlamanın yerini alacak ve sadece şemalardan kod üretecektik.

Yanılıyorlardı. Bu, insanların konuşmayı bırakıp mağara resmine döndüğü zaman olacak.

Gerçek dünyadaki sorunlar ve bunları çözen programlar, azaltılamayan önemli bir karmaşıklığa sahiptir. Çalışan bir program üretmek için, bu karmaşıklık yakalanabilir ve çalıştırılabilir bir dilde ifade edilmelidir. Soru, bazı şematik programlama dilinin, metinsel bir programlama diline göre daha etkili olup olmadığıdır. Yaklaşık otuz yıldır diyagramatik programlamayı deniyoruz ve şu ana kadar kanıtlar ezici bir şekilde metinsel programlama lehine. Diyagramlardan kod oluşturma ile üretilen önemli bir uygulamanın farkında değilim.


2
+1, gerçek kelime problemlerinin karmaşıklığı ile ilgili sorunu ortaya çıkardığınız için teşekkür ederiz. Harika nokta.
NoChance

LabVIEW'da kullanılan grafik programlama dili G nedir?
Angelo.Hannes,

1
@ Angelo.Hannes: Gerçek dünyadaki problemleri labview'teki değişmez yaklaşımlarda şu şekilde çözme: img.thedailywtf.com/images/201104/labview.jpg
whatsisname

@ Bu adın adı çok karışık. Ancak LabVIEW'da gerçek dünya problemlerini çözen çok iyi yapılandırılmış ve çok "okunabilir" diyagramlar gördüm.
Angelo.Hannes,

@ Angelo.Hannes: LabVIEW'a benzer sistemler kullandım. Sınırlı bir alanda küçük uygulamalar oluşturmak için iyidirler.
kevin cline

9

HAYIR

Efsane, şu yazılı başarısız varsayımına dayanıyordu:

class ClassName extends SomeThing
{

}

... zor ve otomasyona ihtiyaç var .

Ara sıra inananları veya inananların kalabalığını hala bulabilirsiniz .
Ama bu, dinler ve kültlerle böyle yürüyor.


4
Gerçekten bir yerlerde büyük bir NO olan bir cevaba ihtiyacım olduğunu hissettim .
ZJR

6

Orada bulundum, çok yararlı bulamadım.

Genellikle bunlardan bazı kodlar üretebilecek kadar spesifik olan şemalar, çoğunlukla sınıf şeması, aslında programı anlama yolunda fazla bir şey katmaz ve kullanım durumu ya da genel bakış düzeyinde aktivite gibi genel bakış şemalarından kod oluşturamazsınız. belgeler için çok önemlidir. Anlamak için yararlı olan ve koddan üretilen kodlara sahip olabilecek bir diyagram, durum makinesine gerçekten ihtiyacınız olduğunda kullanışlı olan durum çizelgesidir. Ancak, genellikle bunlardan kaçınmaya çalışmalısınız, çünkü bunlar doğal olarak hataya açıktır.

Bir projede, kodu UML modellerindeki (Rhapsody) tasarlamamız ve oradan oluşturmamız gerekiyordu. Bu tür çalıştı ve muhtemelen başlıkları (C ++) ve prototipleri elle yazmaktan çok daha kolaydı. Bu ikisini otomatik olarak tutarlı tutabilmek biraz kullanışlıydı.

Yöntem gövdelerinin hala el ile doldurulması gerekiyordu, çünkü diyagramlar durum makinesi iskeletlerinin haricinde bunu gerçekten temsil edemezdi.

Öte yandan oldukça karmaşık, bu yüzden çok fazla şey öğrenmek zorundasınız ve daha da önemlisi birleşmesi gereken acıydı. Birleştirme, metin dosyaları için iyi araştırılmış ve onlarla birlikte çalışmaktadır, ancak hiç kimse diyagramlardaki değişiklikleri birleştirmek için kolay bir yol bulamadı. Rhapsody aslında üretilen koddaki bilginin bir kısmını tutar ve geri ayrıştırır, bu yüzden tamamen kullanılamazdı, ama yine de ciddi bir komplikasyondu.


@mouviciel: Böyle problemleri olmayacak bir araç olduğunu sanmıyorum. Rhapsody aslında üyeler için yetkili olan metin olan oluşturulan kodu kullanarak en kötü sorunları azaltmaya çalışıyor.
Jan Hudec

3

Doğruca UML modellerinden kod üretmek (ve hatta tüm sistemleri oluşturmak) kesinlikle mümkün olsa da, bu şekilde kullanıldığında hiç karşılaşmadım.

Tecrübelerime göre, çoğu şirket bunu gereksinimler için bir iletişim aracı olarak ya da “Diyagram çizme için MS Paint” olarak kullanıyor gibi görünmektedir.

Yapmak istediğim önemli bir ayrım, çoğu UML modelleme aracının sisteminizin tek bir modelini oluşturmanıza izin vermesidir. Örneğin, Visio, UML'nin nasıl çalıştığını oldukça iyi anlıyor ve doğrudan diyagramla ilgili olmayan ekleyebileceğiniz birçok şey var. Gerçek şemalar, modelin bölümleri üzerinde basitçe farklı bakış açılarıdır ve sistemin farklı yönlerini vurgulamanıza olanak tanır.


1

hepsi (model şemaları) iletişim amaçlıdır

Modelleme, yazılım geliştirme sürecinde 4 önemli kullanım alanına sahiptir:

  1. Entegre Tasarım aracı

  2. İletişim aracı

  3. Yazılım üretimi için bir yardım

  4. Gerçek-kelime probleminin karmaşıklığını azaltmanın bir yolu (bunu yukarıdaki kevin cline'nin tepkisinden öğrendim)

  5. Modelleme süreci, bazı tasarımcıların kodlama sırasında dikkate alınmayan detaylar hakkında düşünmelerini sağlar (ve bunun tersi de geçerlidir). Tasarım zamanında modelleme, bir yöntemi veya dili bir dilde kodlamaktan daha büyük bir resim düşünmenize olanak sağlar.

Bence modelleme, veri tabanları oluşturmak (ER Diyagramları), proses akışlarını anlamak (Aktivite Diyagramları) ve kullanıcı-sistem etkileşimlerini anlamak için hayati öneme sahiptir (Vaka diyagramlarını kullanın).

İnsanlar kod veya veritabanı oluşturma gibi daha karmaşık şeyler yapmak için UML kullanıyor mu?

Evet kesinlikle. ERD'ler (UML şeması değil) ve Sınıf Şemaları (aracınızın özelliklerine bağlı olarak) aşağıdakileri oluşturmak için kullanılabilir:

1 - Veri Tanımlama Dili (DDL)

2 - CRUD ve Sınıf Diyagramları için tercih ettiğiniz dilde Saklı Prosedürler (ORM araçları bu konuda daha fazla şey yaptığından daha az faydalıdır)

Modelleme araçlarının en değerli özellikleri arasında:

1 - Modelin bütünlüğünü koruyabilme. Bir değişiklik yaparsanız modelde yayılır

2 - Kullanılan soruları cevaplayabilme (modelimde kullanılan 'hesap' nerededir?)

3 - Eşzamanlı kullanıcıların model üzerinde çalışmasına izin verme

4 - Grafiksel gösterimler içinde ara

5 - Baskı kontrolü

6 - Her seferinde bir katmana odaklanabilmeniz için katmanlama (diyagram öğelerinizi katmanlarda düzenleme)

7 - Çeşitli veritabanı sistemleri için veritabanı kodu üretimi

8 - Model doğrulama (tutarlılığı, eksik anahtarları, döngüleri vb. Kontrol eder)

Bu yüzden, modelleme araçları, özellikle de iyi olanlar, Paint'ten çok daha fazlasını yapar.


3
2 şeye işaret etmek istiyorum: 1. Sıralı listeleri seviyorsunuz.
talnicolas

@talnicolas, haklısın! Yaparım :)
NoChance

0

Yazılım Mimarı'nı, üst düzey tasarımlar yapmak ve eşyalarımızdaki daha eğlenceli bileşen etkileşimlerini belgelemek için kullanıyoruz. Bazen uygulamanın iskeletini diyagramlardan oluştururuz, ancak bu yapıldığında, her ikisini de ayrı tutarız, tamamlandıktan sonra kodu bir diyagrama geri döndürmeye çalışmaz. Küçük programlar için oldukça iyi çalışan Rational XDE adlı bir araç kullanırdım, ancak Swing etkinlik işleyicilerini eklemeye başladığınızda veya Struts ile çalışmaya çalıştığınızda kaybolurdu.

İnsanların UML'de yazmama nedeninin büyük bir kısmı, UML'deki her şeyi tamamen belirtip daha sonra şemanızdan kodu oluşturmak için çok daha fazla çalışmanın gerekli olduğunu düşünüyorum. ABD DoD’unun OMG ile birlikte çalıştığını ve doğrulanmış olan diyagramlardan “kanıtlanmış” kod üretecek bazı araçlar geliştirmek için çalıştığını biliyorum, ama benim izlenimim, gerçek koddan daha fazla meta veri siparişi vereceğinizdir. Muhtemelen iyidir (sonuçta belgeler), ancak meta veri üretmek kod yazmaktan daha hızlı değildir, bu yüzden harcamaları orantılı olarak daha fazla zaman harcarsınız.


0

UML'nin kendisi bir gösterim sistemidir, böylece iletişim ve belgelemeye neden olur. UML modelinden kod üretmek nadirdir, ancak bunu yapan adamlar var. Muhtemelen kullanıcılar bunu Rose'dan daha sık yaparlar. Zor kısım, model ve kodu senkronize tutmaktır, gerçek projelerin çoğu için maliyeti çok yüksektir.


-1

En son projemde UML-Lab kullanıyorum (https://www.uml-lab.com). Bu, modelin de tersine mühendislik edilmesini sağlayan hoş bir araçtır. Araç, java kodunu ve hatta oldukça doğru olan JPA ek açıklamalarını oluşturur.

Bir takımda çalışırken bunun zorluğu. Model statiktir ve birden fazla geliştirici değişikliği ile senkronize kalmasını biraz zorlaştıran tek bir kaynakta bulunur. Araştırıyorsanız araştırmak ve başkalarıyla karşılaştırmak için iyi bir zaman olan 1 ay boyunca kullanılabilen deneme sürümü vardır.

Bu, kod oluşturma ile birlikte tek seferde Nesne modelleme ve veri modelleme yapan bir ürün gördüm.

Aksi takdirde geçmiş projelerimde her zaman yanlış veya çok detaylı olan eski modeller gördüm.

Geçmiş projelerimde bazen tersine mühendislikle diyagramlar oluşturdum. Diyagramların bulduğum çoğu zaman karışık olduğu ve tüm gürültüyü elle filtreleyerek çizmeyi tercih ettim.


-4

Kod üretmek için UML kullanabiliriz. İş mantığı değil, çünkü iş mantığı standart değildir ve uygulamaya göre değişir. ER diyagramları ile birlikte sınıf diyagramları, arayüzler, sınıflar, kış uykusundaki varlıklar, temel dao yöntemleri, vb. Üretmek için kullanılabilir. Cephe uygulaması, veri tipi dönüştürücüler (örneğin, nesneleri transfer etmek için varlık) gibi diğer boyler kodu da, nesne şekillerinin yardımı ile üretilebilir. .

Ayrıca, önceki yorumlarda belirtildiği gibi, veritabanı şeması, DDL komut dosyaları vb. Modeller kullanılarak üretilebilir.

OAW ve Enterprise Architect gibi modelleme araçlarını kullanarak, daha basit kod üreteçleri yazabiliriz, bu da yapılandırma dosyaları, kalıplaşmış kalıplar ve etiketli değerler kullanarak fabrika kodu üretmeye yardımcı olabilir.


-5

Neden Business Object gibi araçlara sahip iş zekasının neden tüm şirket bilgilerinin analizini yapabildiğini ve faydalanabildiğini anlamıyorum, teknolojik düzeyde hala sadece kod düzeyinde veya UML ile soyut düzeyde çalışıyoruz !!

Sorun UML değil, UML ve MOF arasında model dönüşümü ve bir clas şemasından veya xmi'den şablonlar kullanarak kod üretimidir. UML'nin gerçek dünyaya soyut bir bakış açısı kazandırdığı söylenir, bu nedenle sadece gerçekten neyin önemli olduğunu görürsünüz. UML şeması gerçek dünyanın sadece bir görüntüsü ise, doğru kodun nasıl üretileceğini söylemiştiniz? Bu imkansızdır ve bu nedenle bir modelden kod üreten model odaklı geliştirme başarısız olmuştur.

Çözüm, gerçek dünyayı ve dolayısıyla tüm proje kodlarını tek bir UML modeline eşlemeye dönüştürmektir. Tek bir modele ve proje tam mantığına sahip olmak, daha sonra her seferinde koddan değil modelden görünümler oluşturabilirsiniz. Java / Jee teknolojisinde Omondo tarafından yapılan cesur bir girişim var. Konsept, MOF ve UML'yi doğrudan kod ve ORM ile senkronize eder. UML şeması şimdi tüm projenin haritasını çıkaran modelin sadece yüksek seviyeli bir görüntüsüdür. Projeyi daha iyi anlamak için yüzlerce görünüm oluşturabilir, yüzlerce not ekleyebilir, vb. Kod yalnızca eleman değiştiğinde veya oluşturulduğunda üretilecektir. MOF ve UML arasındaki geleneksel dönüşüm köprüsü olmadan Java Id'nin UML kimliğiyle eşleştirildiği muhteşem teknoloji.

Ayrıca etkileyici olan, etki alanımı UML düzeyinde modelleyebilmek ve ORM ek açıklamalarımı doğrudan koda dahil edebilmek ve bu nedenle Hazırda Bekletme kullanarak kalıcı bir tümleştirmeyle oluşturabilir, silebilir, veritabanımı oluşturabilir, dağıtabilir ... UML, projenin mimarisinin değil tüm mimarinin bir parçasıdır.

Kodla canlı senkronizasyon yapıldığında UML tarafından asla üst düzey izleyici olarak hiç hayal kırıklığına uğramadım, ancak Model güdümlü geliştirme şablonları kod oluşturma ile MDA kullanılarak geleneksel olarak kesinlikle mahvoldu. Modelden kod oluşturma, bir sözcük belgesinden gelen bir HTML sayfası gibidir. Oluşturulduktan sonra nasıl değiştirilir? Güncellemek imkansızdır ve kodu temizlemek için sıfırdan yazmak yerine daha fazla zaman harcarsınız!


1
Bu bir cevap adam değil, sadece bir şikayet. Kodlayıcıların neden hala her satır kodunu yazdıkları konusunda biraz katılıyorum, bu arada sürükle ve bırak ile küçük kod yapıcıları oluşturmak KOLAY. Bussiness’in, teknolojiyi kullanan kullanıcılardan daha iyi bir uygulama yaptığı konusunda haklısınız. Uygulamanızla saniyeler içinde önceden yapılandırılmış bir makine oluşturabilirsiniz, ancak birkaç (binlerce) tıklama veya tuş vuruşuyla yazılım oluşturamazsınız. Ekstra. Día ve Pythonnect'in doğrudan UML'nizden kod yürüterek hoş bir çalışma yapabildiğini, ancak henüz test etmediklerini gördüm.
erm3nda
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.