《工作笔记二》python自动生成代码
为什么需要自动生成代码在游戏公司我发现一个问题,存在大量相似的代码,而公司主程处理这些相似代码的办法则是编写自己的代码生成工具来自动生成这些代码,因为编写相似的代码不仅耗时,还不能保证每个人编写的代码格式是否标准,所以在这里使用代码生成工具能提升效率的同时,让程序员更加的专注与逻辑部分的编辑。那选择什么方式来生成代码呢我公司里的两位主程分别采用了不同的方法,首先项目老大使用的时正则...
为什么需要自动生成代码
在游戏公司我发现一个问题,存在大量相似的代码,而公司主程处理这些相似代码的办法则是编写自己的代码生成工具来自动生成这些代码,因为编写相似的代码不仅耗时,还不能保证每个人编写的代码格式是否标准,所以在这里使用代码生成工具能提升效率的同时,让程序员更加的专注与逻辑部分的编辑。
那选择什么方式来生成代码呢
我公司里的两位主程分别采用了不同的方法,首先项目老大使用的时正则表达式来进行代码替换,但是我在使用这个的时候发现,正则确实不好用,对于一些程序员编写代码不规范,正则在这里就无法识别了(当然除非你使用正则特别牛逼),提示替换就会出错,对于替换出错我是深有体会的(改的蛋疼)。后来另一个主程大佬说用个这方法不是很好,采用模板的方法来处理这些比较好。之后大佬真的采用模板方法来做了个自动生成读取xml配置文件的工具,当时我是一万个敬佩。所以我到网上查阅了下模板方法替换的方式生成代码。
编写模板
下面我来编写一个简单的模板,自己创建一个文件,并修改文件名及后缀,文件名为:“default.tmpl”,其中使用${}的方式来获取外部传进来的数据。
#ifndef __${CLASSNAME}_H__
#define __${CLASSNAME}_H__
#include <map>
class C${Class_Name}
{
public:
C${Class_Name}() {}
~C${Class_Name}() {}
public:
struct ${En_name}_struct
{
public:
${En_name}_struct() : m_${Name}(0) {}
${Type} m_${Name};
};
private:
std::map<${Type}, ${En_name}_struct> m_${En_name}_cfg;
};
#endif
编写python代码
我问了下大佬,他是用go语言编写的exe,但是我对go不大了解,想着采用python来编写。
文件名:”build.py”
#! /usr/bin/env python
#coding=utf-8
from string import Template
class BuildData:
def Init(self):
filePath = './default.h'
class_file = open(filePath, 'w')
mycode = []
# 加载模板文件
template_file = open('default.tmpl', 'r')
tmpl = Template(template_file.read())
# 模板替换
mycode.append(tmpl.substitute(
CLASSNAME = 'DEFAULT',
Class_Name = 'Default',
En_name = 'mystruct',
Type = 'int',
Name = 'value'))
# 将代码写入文件
class_file.writelines(mycode)
class_file.close()
print('ok')
if __name__ == '__main__':
build = BuildData()
build.Init()
结语
执行上面的python文件,会在本路径下生成一个”default.h”的头文件,我们来看看我这里生成的代码
#ifndef __DEFAULT_H__
#define __DEFAULT_H__
#include <map>
class CDefault
{
public:
CDefault() {}
~CDefault() {}
public:
struct mystruct_struct
{
public:
mystruct_struct() : m_value(0) {}
int m_value;
};
private:
std::map<int, mystruct_struct> m_mystruct_cfg;
};
#endif
到这里我的简单的代码生成器就实现了,可以根据这类方法编写自己的生成器,像大佬那样自动生成读取xml的配置文件的话,则可以在python里先读取xml里面的数据(当然少不了的是对每一个xml表都非常了解),在赋值到里面去,我这里为了方便起见直接用了静态数据。一点多了该睡觉了!
更多推荐
所有评论(0)