如何把一段简单的代码变复杂?
例如,我们要打印出一句“Hello World!”,这样就太low了:
print("Hello World!")
至少也得封装一层函数吧:
def main(sentence="Hello World!"):
print(sentence)
if __name__ == "__main__":
main()
不不不,还是太简单了:
class Main:
def set_sentence(self, sentence="Hello World!"):
self.sentence = sentence
def print(self):
print(self.sentence)
if __name__ == "__main__":
m = Main()
m.set_sentence()
m.print()
这样不够灵活,万一需要重定向输出或输入呢?
import sys
class Main:
def redirect_stdin(fromfn=""):
if fromfn:
self.temp_stdin = sys.stdin
sys.stdin = open(fromfn)
def redirect_stdout(outfn=""):
if outfn:
self.temp_stdout = sys.stdout
self.stdout = open(outfn)
def set_sentence(self, sentence="Hello World!"):
self.sentence = sentence
def print(self):
print(self.sentence)
if __name__ == "__main__":
m = Main()
m.set_sentence()
m.print()
再优化亿点:
import sys
class PrintInterface:
def redirect_stdin(self, romfn=""):
if fromfn:
self.temp_stdin = sys.stdin
sys.stdin = open(fromfn)
else:
raise RuntimeError("无效输入文件")
def redirect_stdout(self, outfn=""):
if outfn:
self.temp_stdout = sys.stdout
self.stdout = open(outfn)
else:
raise RuntimeError("无效输出文件")
def reset_stdin(self):
if hasattr(self, 'temp_stdin'):
sys.stdin = self.temp_stdin
else:
raise RuntimeError("错误:没有被重定向过")
def reset_stdout(self):
if hasattr(self, 'temp_stdout'):
sys.stdin = self.temp_stdout
else:
raise RuntimeError("错误:没有被重定向过")
class Main(PrintInterface):
def set_sentence(self, sentence="Hello World!"):
self.sentence = sentence
def print(self):
print(self.sentence)
if __name__ == "__main__":
m = Main()
m.set_sentence()
m.print()
(后面请自行脑补)
但是!你有了那么一套,该怎么创建实例呢?直接Printer()?太low了,那叫实现依赖。肯定不行的,所以要搞一个工厂类,PrinterFactory,PrinterFactory用PrinterInterface返回实例,这样就隐藏了实现细节了。
但是!PrinterFactory本身也是实现类啊,太low了,所以得有PrinterFactoryInterface, AbstractPrinterFactory.
而且在PrinterFactory里面该怎么写呢?直接Printer()? 太low了。还是实现依赖。
最后,你要把这一堆玩意在代码里组装起来,也太难看了,各种 = 实现类。太low!
好在我们有个高级玩意,叫依赖注入!把程序对象结构全写到配置文件里面。这一套当然是不能自己造轮子ip的。配置pu吧。搞了那么多lib,靠命令行或者IDE的项目管理肯定不够啊,得有依赖管理。pipenv啊conda environment啊使劲上。
最最后,要print的东西怎么传给程序呢?硬编码?命令行传参数?太low!当然得写在XML里头。
光是XML当然还不够企业级,再加上DTD验证吧。
然后就涉及到了XML解析的问题了。代码里直接操起parser吗?太low! 当然要写个parser的包装类,interface, abstract class, implementation class, factory class再来一套。毕竟,不能依赖实现啊,以后我要是换parser了怎么办。
所以最后是成品是一堆配置文件,一堆cfg,pyinstaller出来的程序200MB。
pip得装上300个库,打开项目硬盘响老半天吃掉4GB内存,然后一堆插件弹提示要求升级。
哦对了,在这一切发生之前,还得画UML图呢。
三年后项目完工了,部署到客户的服务器上一跑,立马崩溃,一地的RuntimeError。原来客户服务器上用的是Python 2.7而新项目需要Python 3.6以上 然后问客户你们不能升级吗,答案是不行,因为另外一个企业级开发组给做的企业级解决方案只支持Python 2.7。接着客户把你们的架构师臭骂了一顿,你搞了那么多设计就没有想过可能会换Python吗?

浙公网安备 33010602011771号