Replies: 1 comment 3 replies
-
|
蒋佬牛逼 |
Beta Was this translation helpful? Give feedback.
3 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
在现有的要求下,我认为全面禁止第三方库的要求是不合理的。这体现在以下几点:
部分要求不使用第三方库几乎无法实现
现在已知的较棘手的功能主要集中在对字符的处理中。本项目需要处理汉字,那就需要考虑编码问题。正常情况下应该整个程序 UTF-8 化,但由于该禁令,至少人为引入了三个(不必要的)难点:
std::setw当然是不能直接用的,中文可能用 2 个字符,可能用 3 个字符。光是实现了简单的一个解决方案就用了两组第三方的代码(UTF8-CPP 和一个 portable 的 wcwidth 实现),且我已经将该方案 Pull Request 到本 repo。如果因此我要被判定使用了两个库,其他同学用我的代码被判定使用了三个库,无疑是相当滑稽的。length函数计算长度,应该判定真实长度,即我们就需要判断一段字符串中 code point 的数量而不是 code unit 的数量。以 UTF-8 为例,这必须要使用 UTF8-CPP 、icu 或 iconv 等处理库。否则就需要自己写字符边界检测(见下面的理由 2)——极为脏的做法。我们不应该让代码里充斥着这种和业务无关的轮子;在不使用第三方库的情况下,许多功能重复的造轮子难以带来同学水平上的实质提高
虽然这门课《高级程序设计》作为一门和工程接轨的课程,需要在一定程度上锻炼学生造轮子的能力,但对一切 STL 没有的功能都要求自己实现,很多时候并不会实质上提高水平。如上面提到的字符集、字符数量、对齐问题,很多同学并不会深入去了解字符集与编码,Unicode 与 UTF,ICU 与 iconv,code point 与 code unit,Unicode 对东亚字符宽度的数据集等细节,而是直接找网上的解决方案完事。这样既造成了代码混杂,也没有锻炼能力。
同时,一些第三方库可以在合理范围内提高效率,如使用 fmtlib 而非
sprintf。虽然我可以用几行代码调用sprintf并放进std::string来避免使用 fmtlib,但这样的努力是无效在努力,并不会带来能力上的提高。这样的例子还有很多,如手动写日志而不用 spdlog,等等。诚然,我理解课程设计上防止通过调库把核心功能省略(如用 Boost.Spirit 直接规避字符串解析),或造成“军备竞赛”的局面。但直接禁止使用一切 STL 外的库,是否有些过于武断而“一刀切”呢?对这些库的审查应该是特异性的、选择性的。
另外,我认为对于工业需要而言,选择合适的第三方库并阅读其文档以使用、正确处理第三方库的依赖,构建可以自动化解析第三方库的构建工作流也是极重要的技能,同时是具有挑战性的任务。而全面的禁令使这些能力得不到练习。
C++ STL 作为库的边界是没有理由的
课程中规定允许使用的库的边界是 C++ STL 及 C 标准库等。然而,这是没有逻辑的——为什么决定一个功能应当引入还是自行实现,要根据 C++ 标准委员会有没有将其标准化?
更进一步,近年 C++ 标准变化迅速,那这个库的边界基于何 C++ 标准版本呢?C++11? 14? 17? 20? 23? 特别是很多功能虽然已经标准化,但仍没有完全实现,如 C++20
std::format至今没有在 gcc 实现。那这种情况下,我引用 fmtlib 代替和使用 C++20 的std::format似乎没有实质上的区别。去年的《程序设计基础实验》课程并没有全面禁止第三方库。
课改前的这门课并没有这样的要求,仅仅禁止了使用“几十行代码解决核心功能”的 all-in-one 式第三方库的使用。且高程+程设实验是两门课加起来 5 学分,现在变成 3 学分。学分变少了不合理要求增加了,这不得不说有一些不合理。
此要求严重束缚发挥
在此要求上,很多点子难以或根本无法实现。如为了实现模块间的低耦合,应该考虑使用控制反转,但如果不用 fruit 等库,自己实现一套 DI 框架吗显然是不可能的。
更别提没法用 Qt 了。
基于以上 1~5 点,我衷心提议修改本课程的要求,以允许第三方库,至少是一部分第三方库(如参考《数据结构》课程的要求:仅允许使用与数据结构与算法无关的)的使用。
抄送 @binbin00
Beta Was this translation helpful? Give feedback.
All reactions