
发表日期: 2021-04-25 10:53:33 浏览次数:133
泰州微信公众号开发【泰州网络推广】泰州建站、泰州网站维护、泰州网页制作、泰州微信小程序代运营公司
泰州,简称“泰”,古称海陵,是江苏省地级市,长江三角洲中心区27城之一 [1] ,国务院批复确定的中国长江三角洲地区重要的工贸港口城市 [2] 。截至2018年,全市下辖3个区、代管3个县级市,总面积5787.26平方千米,常住人口463.57万人,城镇人口305.96万人,城镇化率66.0%,全年实现社会消费品零售总额1282.87亿元。 [3]
泰州地处中国华东地区、江苏中部,是扬子江城市群重要组成部分,南濒长江、北邻盐城、东临南通、西接扬州,是承南启北的水陆要津,为苏中门户,自古有“水陆要津,咽喉据郡”之称。700多年前,马可·波罗游历泰州,称赞“这城不很大,但各种尘世的幸福极多”。 [4]
泰州是国家历史文化名城,秦称海阳,汉称海陵,州建南唐,文昌北宋。南唐时(公元937年)为州治,取“国泰民安”之意,始名泰州。泰州人文荟萃、名贤辈出,“儒风之盛,素冠淮南”。王艮、刘熙载、施耐庵、郑板桥、梅兰芳是泰州文化艺术史上的杰出代表。 [4]
泰州所辖县市(区)全部建成国家级生态示范区、全国百强县,同时泰州也是全国文明城市 [5] 、国家环保模范城市 [6] 、国家园林城市、中国优秀旅游城市、全国科技进步先进市、第一批国家农业可持续发展试验示范区。2017年中国地级市全面小康指数排名第42 [7] 。
2018年11月,入选中国城市全面小康指数前100名。 [8] 12月,被评为2018中国大陆最佳商业城市100强。2020年10月9日,被生态环境部授予第四批国家生态文明建设示范市县称号。2020年10月,被评为全国双拥模范城(县)。
但是,我们寻求的是通用的解决方案(也不要过于通用,以至于考虑过多),也不要对已处理过的行为重复编码。
可以提供一个让测试通过的解决方案,如下:
std::string encode(const std::string& word) const {
if (word == "Ab") return "A100";
return zeroPad(word);}复制代码然而,对于用数字替换辅音而言,这一段代码不是通用的解决方案。它也引入了一些重复的东西:特例"Ab"的结果为"A1"的补零对齐输出,即"A100",但是我们已经有了对任何词做补零操作的通用代码。
你可能认为这个理由不太充分,或许是吧。如果不限定时间,你能给出的替代方案数目可能也是无穷无尽的。但是TDD不是纯粹的科学,相反,可以把它想成软件工匠用来增量开发代码的工具。这个工具适合持续的实验、发现和改进。
行动胜于空谈!下面是迈向通用解决方案的一步:
c2/13/Soundex.h
std::string encode(const std::string& word) const {➤ auto encoded = word.substr(0, 1);➤➤ if (word.length() > 1)➤ encoded += "1";➤ return zeroPad(encoded);
}复制代码运行一下,新的测试没有通过。
Expected: is equal to 0x80b8ac4 pointing to "A100" Actual: "A1000" (of type std::string)复制代码
补齐逻辑不对。必须修改它,以考虑到待编码词的长度。
c2/14/Soundex.h
std::string zeroPad(const std::string& word) const {➤ auto zerosNeeded = 4 - word.length();➤ return word + std::string(zerosNeeded, '0');
}复制代码测试通过了。太棒了!但是代码看起来变得有点乏味。当然,我们知道自己编写的encode()是怎样工作的。但是其他人可能需要花更多时间,仔细阅读代码,以理解其背后的意图。其实我们可以做得更好。先把它重构为更具可读性的方案吧,如下:
c2/15/Soundex.h
class Soundex
{
public:
std::string encode(const std::string& word) const {➤ return zeroPad(head(word) + encodedDigits(word));
}
private:➤ std::string head(const std::string& word) const {➤ return word.substr(0, 1);➤ }➤ std::string encodedDigits(const std::string& word) const {➤ if (word.length() > 1) return "1";➤ return "";➤ }
std::string zeroPad(const std::string& word) const {
// ...
}
};复制代码瞧,我们正一点点地完善Soundex编码算法。同时,重构有助于确保核心算法清晰,实现细节也很整洁。
以声明性的方式组织代码,使其非常易于理解。设计中非常重要的一方面是从实现(怎么做)中分离接口(做什么),这提供了迈向更高层次设计方案的跳板。每到TDD的重构环节时,都要考虑类似的重组。
有些读者或许担心实现细节。第一,是不是应该用stringstream,而不是直接将字符串连接起来?第二,为什么不尽可能地用单独的char?例如,为什么用return words.substr(0, 1);而非return word.front();?第三,用return std::string();不是比return "";更好吗?
这些替代的代码方案可能更好。但这些都是过早优化(premature optimization)。这个时候,一个好的设计(接口一致且代码可读性高)更重要。一旦以牢靠的设计实现了正确的行为后,再考虑是否优化性能。
撇开过早的性能优化不谈,我们的代码也确实需要雕琢一番。先去掉使用神奇的常量表示Soundex编码最大长度而产生的代码坏味,取而代之,使用一个具有合理名字的常量。
c2/16/Soundex.h
static const size_t MaxCodeLength{4};
// ...
std::string zeroPad(const std::string& word) const {➤ auto zerosNeeded = MaxCodeLength - word.length();
return word + std::string(zerosNeeded, '0');复制代码你怎么看待encodeDigits()中硬编码的字符串"1"呢?我们的代码需要将字母b替换为1,所以不能用变量去掉这个硬编码。我们可以引入另一个常量,或从一个名副其实的函数中返回一个常量。
甚至可以先不管这个硬编码,待到下一个测试时再消除它。但是我们能保证在集成代码前写下一个测试吗?万一我们转去做其他事情了呢?那个时候再回头看这段代码,或许要花费更多的时间来理解它了。请保持增量交付的态度,现在就来解决问题!

服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878