关于如何在类,方法,函数等上构造代码的文献的推荐

时间:2019-07-19 21:22:12

标签: oop uml

尽管我有十年的编程经验,但是在决定如何构造代码时,我感到自己处于业余水平。

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

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

0 个答案:

没有答案