首页 > 解决方案 > 关于如何在类、方法、函数等上构造代码的文献推荐

问题描述

虽然我有十年的编程经验,但在决定如何构建我的代码时,我觉得自己处于业余水平。

我将举一些例子来更好地理解我在说什么。

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 等等。也许是一些视觉方法来指导结构化过程。理想情况下,一种关于如何编写复杂而大的算法的算法。

标签: oopuml

解决方案


推荐阅读