Pythonを応用して書いた簡単なClassコードジェネレータ
6252 ワード
通常、C++クラスやデータ構造を書くのに苦労している場合、各クラスにはクラスに関連する構造、構造関数が4、5個必要です.クラス名と変数名を繰り返すたびに、時間がかかります.これらの関数を省略すると、コードスタイルが悪く、安全ではありません.
クラス名、変数、関数を定義するだけで、比較的完璧なコードを生成できるコード生成ツールがよく見られます.フォーマットが統一され、きれいで安全です.しかし、これらのツールはすべて自分のフレームワークやコンパイルシステムに関連しており、汎用性はあまりよくありません.
最近pythonの応用を学びたいと思って、自分で簡単なClassコードジェネレータを書いてみました.一般的な考え方に従います:きれいで使いやすいインタフェースを設計して、タイプ定義のxmlあるいはその他のフォーマットのデータファイルを生成して、それからコードに翻訳します.この仕事量と複雑なプログラムの設計は私のpython初心者にとって短時間では不可能です.2/8の原則に従って、最も簡単で使いやすいインターフェースを設計して、できるだけいくつかの繰り返し性の労働を完成します.
必要なツールの使用方法:
declareなどのテキストファイルでのみ使用できます.txtでは、最初の行がクラス名に書き込まれ、次の行ごとにタイプ名と変数名が書き込まれます.
生成されたコードには、クラスの宣言と様々な構造と構造関数が含まれます.
例えば:declare.txtファイル内
Test int a float b string c
生成するターゲットコード:
設計構想:
入力方式が確定し、出力結果のフォーマットも確定します.まず、クラスのフォーマットなど、結果に変わらないものを抽出し、テンプレートを作成します.
そして、ClassNameを定義されたクラス名に置き換え、定義された変数を変数宣言リスト、コンストラクション関数パラメータリスト、付与関数リストに組み合わせ、VariableList、DefaultInitializationList、ConstructorParameterList、ParameterInitializationList、AssignmentListを置き換えるだけです.
Pythonコードは、いくつかの文字列の組み合わせ、置換などを完了するだけです.
1日勉強しながら書いて、機能が完備していないので、関数を追加することはできません.変数タイプ宣言は現在1つの文字列しかありません.コードにはスタイルと構造がありません.ただし、使いやすく、後の機能はゆっくり追加できます.
また、pythonの基本文法を学びました
pythonの使用はc++と明らかに異なります.
1.用:{}の代わりにインデント
2.変数のタイプを定義する必要はありません
3.ない&&,|,!and,or,not
4.キーワードはすべて小文字
5.関数パラメータとしてstring、tuples、numbersなどの基本タイプは、値を伝達する方法であり、関数内の変更は無効である.メタグループ、リストの内容は、ポインタや参照のように変更できます.
参照先:http://blog.csdn.net/winterttr/article/details/2590741
6.string関数は、自身を変更することなく、実行または変更の結果を返します.自身を変更する場合は、結果を受信する必要があります.
variableListstring = variableListstring.rstrip("")#余分な末尾記号を削除
7.後続
pythonのWebサイトを学ぶ:http://wiki.woodpecker.org.cn/moin/WeiZhong/2006-01-17
クラス名、変数、関数を定義するだけで、比較的完璧なコードを生成できるコード生成ツールがよく見られます.フォーマットが統一され、きれいで安全です.しかし、これらのツールはすべて自分のフレームワークやコンパイルシステムに関連しており、汎用性はあまりよくありません.
最近pythonの応用を学びたいと思って、自分で簡単なClassコードジェネレータを書いてみました.一般的な考え方に従います:きれいで使いやすいインタフェースを設計して、タイプ定義のxmlあるいはその他のフォーマットのデータファイルを生成して、それからコードに翻訳します.この仕事量と複雑なプログラムの設計は私のpython初心者にとって短時間では不可能です.2/8の原則に従って、最も簡単で使いやすいインターフェースを設計して、できるだけいくつかの繰り返し性の労働を完成します.
必要なツールの使用方法:
declareなどのテキストファイルでのみ使用できます.txtでは、最初の行がクラス名に書き込まれ、次の行ごとにタイプ名と変数名が書き込まれます.
生成されたコードには、クラスの宣言と様々な構造と構造関数が含まれます.
例えば:declare.txtファイル内
Test int a float b string c
生成するターゲットコード:
class Test
{
Test();
Test(int _a, float _b, const string &_c);
Test(const Test &rhs);
Test& operator = (const Test &rhs);
~Test();
public: // private:
int a;
float b;
string c;
};
Test::Test()
: a()
, b()
, c()
{
}
Test::Test(int _a, float _b, const string &_c)
: a(_a)
, b(_b)
, c(_c)
{
}
Test::Test(const Test &rhs)
{
*this = rhs;
}
Test& Test::operator = (const Test &rhs)
{
if (&rhs != this)
{
a = rhs.a;
b = rhs.b;
c = rhs.c;
}
return *this;
}
Test::~Test()
{
}
設計構想:
入力方式が確定し、出力結果のフォーマットも確定します.まず、クラスのフォーマットなど、結果に変わらないものを抽出し、テンプレートを作成します.
class ClassName
{
ClassName();
ClassName(ConstructorParameterList);
ClassName(const ClassName &rhs);
ClassName& operator = (const ClassName &rhs);
~ClassName();
public: // private:
VariableList
};
ClassName::ClassName()
: DefaultInitializationList
{
}
ClassName::ClassName(ConstructorParameterList)
: ParameterInitializationList
{
}
ClassName::ClassName(const ClassName &rhs)
{
*this = rhs;
}
ClassName& ClassName::operator = (const ClassName &rhs)
{
if (&rhs != this)
{
AssignmentList
}
return *this;
}
ClassName::~ClassName()
{
}
そして、ClassNameを定義されたクラス名に置き換え、定義された変数を変数宣言リスト、コンストラクション関数パラメータリスト、付与関数リストに組み合わせ、VariableList、DefaultInitializationList、ConstructorParameterList、ParameterInitializationList、AssignmentListを置き換えるだけです.
Pythonコードは、いくつかの文字列の組み合わせ、置換などを完了するだけです.
import sys # Load the sys module ( sys )
import string
def ReplaceStrings(stringlist, fromString, toString):
for i in range(0, len(stringlist)):
s = stringlist[i]
s = string.replace(s, fromString, toString);
stringlist[i] = s
#print stringlist[i]
f = open("template.txt") # template.txt
templateTextLines = f.readlines() # Read all lines into a list ( )
f.close()
f = open('declare.txt')#(sys.argv[1]) # Filename on the command line ( )
declareLines = f.readlines() # Read all lines into a list ( ), strip all space and
f.close()
typeString = ""
nameString = ""
variableListstring = ""
constructorParameterListString = ""
defaultInitialListString = ""
parameterListString = ""
assignmentListString = ""
for i in range(1, len(declareLines)):
lineString = declareLines[i]
lineString = lineString.lstrip()
lineString = lineString.rstrip()
lineString = lineString.rstrip("
")
if lineString == "": #
continue
splittedStrings = lineString.split()
if len(splittedStrings) > 1: # , : unsigned int
typeString = splittedStrings[0]
nameString = splittedStrings[1]
variableListstring += lineString + ";
"
if typeString=="int" or typeString=="float" or typeString=="double" or typeString=="UInt32" or typeString=="Int32" or typeString == "Float32": #
constructorParameterListString += typeString + " _" + nameString + ", " # ,
else:
constructorParameterListString += "const " + typeString + " &_" + nameString + ", " # ,
defaultInitialListString += nameString + "()
, "
parameterListString += nameString + "(_" + nameString + ")
, "
assignmentListString += nameString + " = rhs." + nameString + ";
"
variableListstring = variableListstring.rstrip("
") #
constructorParameterListString = constructorParameterListString.rstrip(", ")
defaultInitialListString = defaultInitialListString.rstrip("
, ")
parameterListString = parameterListString.rstrip("
, ")
assignmentListString = assignmentListString.rstrip("
")
ReplaceStrings(templateTextLines, "ClassName", declareLines[0].strip("
").strip())
ReplaceStrings(templateTextLines, "VariableList", variableListstring)
ReplaceStrings(templateTextLines, "DefaultInitializationList", defaultInitialListString)
ReplaceStrings(templateTextLines, "ConstructorParameterList", constructorParameterListString)
ReplaceStrings(templateTextLines, "ParameterInitializationList", parameterListString)
ReplaceStrings(templateTextLines, "AssignmentList", assignmentListString)
f = open("out.txt","w") # Open file for writing
for s in templateTextLines:
f.write(s)
# print s
f.close()
1日勉強しながら書いて、機能が完備していないので、関数を追加することはできません.変数タイプ宣言は現在1つの文字列しかありません.コードにはスタイルと構造がありません.ただし、使いやすく、後の機能はゆっくり追加できます.
また、pythonの基本文法を学びました
pythonの使用はc++と明らかに異なります.
1.用:{}の代わりにインデント
2.変数のタイプを定義する必要はありません
3.ない&&,|,!and,or,not
4.キーワードはすべて小文字
5.関数パラメータとしてstring、tuples、numbersなどの基本タイプは、値を伝達する方法であり、関数内の変更は無効である.メタグループ、リストの内容は、ポインタや参照のように変更できます.
参照先:http://blog.csdn.net/winterttr/article/details/2590741
6.string関数は、自身を変更することなく、実行または変更の結果を返します.自身を変更する場合は、結果を受信する必要があります.
variableListstring = variableListstring.rstrip("")#余分な末尾記号を削除
7.後続
pythonのWebサイトを学ぶ:http://wiki.woodpecker.org.cn/moin/WeiZhong/2006-01-17