oop - 关于如何在类、方法、函数等上构造代码的文献推荐
问题描述
虽然我有十年的编程经验,但在决定如何构建我的代码时,我觉得自己处于业余水平。
我将举一些例子来更好地理解我在说什么。
1 - 编译器
我正在为我自己的爱好语言编写一个编译器,我决定创建一个 Logger 类来处理错误消息、警告消息等。然后我不确定如何实施。我应该写这样的东西吗
Logger log;
log.error("error message");
log.warn("warn message");
或者我应该写这样的东西吗?
Logger log;
log.log(Logger::ERROR, "error message");
log.log(Logger::WARN, "warn message");
或者我应该创建一个 LogMessage 类而不是一个简单的字符串?
LogMessage msg;
Logger log;
msg.content("error message");
msg.severity(Logger::ERROR);
msg.file(current_file); // file that produced the log
log.log(msg);
在这种特殊的日志记录案例中,关于日志记录的官方 Java API 似乎实现了所有这些替代方案以及更多。
2 - 一个简单的 TeX 解析器
我正在工作的另一个项目需要解析一小部分 TeX 输入。该项目的其中一个步骤需要读取如下输入:
\chapter{Foo} hello, world \section{Bar}
并将输入拆分为这样的字符串数组
["\chapter{Foo}", " hello, world ", "\section{Bar}"]
我用一个简单的函数实现了这个功能,但是和一个朋友交谈,他说他可能会创建一个专门的类来处理这种拆分,以遵循 SOLID 原则。在这种情况下,他认为类会很小,并且作为 SOLID 倡导者只有一个关注点,并且类比函数更通用。
3 - 再次编译
几乎每个人都知道编译器不是一个简单的项目。但就我而言,我最麻烦的问题是关于如何在编译步骤之间通信和传递数据的抽象。到目前为止,我已经从头开始重写了四次编译器。每次重写我都改进了 Lexer 和 Parser 代码,但我从未脱离语义阶段,因为我仍然没有找到一种合适且有效的方法来将语义步骤、解析器、词法分析器、用户定义的类型联系在一起,和符号表。我所有的方法似乎在无数案例中退化,无法逐个处理,代码变得过于冗长,我感到沮丧,因为在我看来,我相信有一种更好、更优雅的编码方式,而不是逐个处理。
例如,考虑以下要由编译器处理的输入
p->foo[2](2, 3)
p->bar = 2
p->baz[2][3].foobar->foo[2](2, 3)
那些简单的输入让我做噩梦,因为我必须检查,例如,-> 运算符的左侧是否是一个简单的成员、一个函数、一个数组等等。为了产生错误消息,我必须协调符号表、产生错误的文件的名称等等。我迷失了如何在不产生过于冗长的代码的情况下传递如此多的信息。
在我来这里问这个问题之前,我真的想过如何不让这个问题变得自以为是,主观等等。所以我决定索要关于这个主题的书籍、文章等。我想要关于如何构建程序的文献推荐。如何决定给定的功能是否应该作为类、方法或函数来实现。关于如何定义抽象以在软件堆栈的各层之间进行通信。如何定义 API 等等。也许是一些视觉方法来指导结构化过程。理想情况下,一种关于如何编写复杂而大的算法的算法。
解决方案
推荐阅读
- php - “未捕获的 Twig_Error_Loader”错误与 Materialise 模板,OpenCart 3
- python - 有条件的熊猫唯一值
- python - 在 Python 2.7 中,为什么字符串在文本模式下比在二进制模式下写得更快?
- spring - 使用 RestTemplae 获取 vavr Multimap 后的反序列化错误
- machine-learning - PyTorch 教程中的交叉熵计算
- excel - 更新图表的源数据范围
- git - 如果我从另一个分支推送,是否会在 git 分支上提交?
- ubuntu - Pylint 不能在 Jenkins 内部运行
- c++ - 私钥解密代码使用 BSAFE 库 v6.0 的公共接口说明符?
- javascript - Javascript Web Scraping 几个 url