如何把一段简单的代码变复杂?

例如,我们要打印出一句“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吗?

posted @ 2022-04-10 11:14  WindowsRegedit  阅读(95)  评论(0)    收藏  举报