コード生成UML-> Python(Django)

4年前、新しい仕事を得て、Python + wxWidgets + MSSqlにまともなサイズの会計システムを見ました。 すべてのソースコードは、UMLダイアグラムに基づいて自動的に生成されました。 数年後、この開発方法に非常に感銘を受けたため、Djangoの自分のプロジェクトでコード自動生成を使用し始めました。
「コード生成」プロジェクトを作成するプロセスがどのように見えるかを見てみましょう。


まず、優れた機能を備えたUMLエディターを見つける必要があります。 Sybase Power Designerを使用しています 。 その中で、ほとんどすべてが可能です。
インストール直後、PowerDesignerはC ++、Java、C#、Visual Basicプロジェクトを生成できます。 独自のコードジェネレータを作成することはまったく難しくないため、少し作成して独自のコードジェネレータを使用します。

すべてが最初のクラスを描く準備ができています:


それをFooと呼び、__call__メソッドを追加しましょう:


メソッドに渡された1つのパラメーターの値を出力します。


作成されたクラスのコードジェネレーターの出力で何が得られるかを見てみましょう。


各クラスのソースコードは、個別のモジュールに配置されます。 モジュールは、パッケージの階層に従って配置されます。
これまでのところ、印象的なことは何もしておらず、コードジェネレーターはその存在を正当化していません。
さらに2つのCheckHelperクラス、PrintHelperを使用して例を拡張しましょう。 そして、Fooには作曲のようなつながりがあることを示しましょう。


生成されたコードを見てみましょう:

# -*- coding: cp1251 -*-

#***********************************************************************
#* Module: foo.py
#* Path: foo
#* Author: danil
#* Modified: 11 2009 . 10:50:37
#***********************************************************************
import checkHelper
import printHelper

class Foo( object ):


class __C_CheckHelper( object ):
def __get__(self, obj, cls):
if obj is None:
return checkHelper.CheckHelper
value = getattr(obj, '#checkHelper' , None)
if value is None:
value = checkHelper.CheckHelper()
setattr(obj, '#checkHelper' , value)
return value
def __set__(self, obj, value):
raise AttributeError
def __delete__(self, obj):
setattr(obj, '#checkHelper' , None)
checkHelper = __C_CheckHelper() #B #B


class __C_PrintHelper( object ):
def __get__(self, obj, cls):
if obj is None:
return printHelper.PrintHelper
value = getattr(obj, '#printHelper' , None)
if value is None:
value = printHelper.PrintHelper()
setattr(obj, '#printHelper' , value)
return value
def __set__(self, obj, value):
raise AttributeError
def __delete__(self, obj):
setattr(obj, '#printHelper' , None)
printHelper = __C_PrintHelper() #B #B

def __call__(self, val):
if self.checkHelper(val):
self.printHelper(val)


* This source code was highlighted with Source Code Highlighter .


クラス参照はクラスを通じてラップされていることがわかります。 オブジェクトは、最初にアクセスされたときに一度作成されます。 コードジェネレーターは、このような必要な構造の生成を引き受け、プログラマーは必要なパラメーターで矢印を引き伸ばすだけで済みます。

プロジェクト開発へのこのアプローチが私たちに与えるものを要約しましょう:
1.典型的なコードの自動生成による開発の速度。
2.プロジェクトの読みやすさ、UMLダイアグラムのナビゲートは、ファイル内のソースコードの読み取りよりもはるかに簡単です。
3.オブジェクト間のすべての通信を迅速に追跡することによる近代化の容易さ。

これは単なるレビュー記事です。もしhabrosocietyに興味があるなら、djangoプロジェクトの生成に関するステップごとのチュートリアルを書きます。

Source: https://habr.com/ru/post/J74923/


All Articles