
发表日期: 2021-04-25 11:04:40 浏览次数:80
泰州企业微信公众号小程序开发公司、泰州企业网页设计方案、泰州做网站开发价格、泰州微信公众号制作运营报价明细表、泰州网站设计公司费用、泰州网站推广大概需要多少钱
泰州,简称“泰”,古称海陵,是江苏省地级市,长江三角洲中心区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月,被评为全国双拥模范城(县)。
c2/33/SoundexTest.cpp
TEST_F(SoundexEncoding, IgnoresVowelLikeLetters) {➤ ASSERT_THAT(soundex.encode("BaAeEiIoOuUhHyYcdl"), Eq("B234"));
}复制代码测试通过了,我们可以丢掉刚才更新了的测试。但是为了其他开发者考虑,我们决定保留此测试,用来显式地文档化此行为。
由于不是很确定代码的行为,我们不得不再写一个测试。但是当它立马通过时,我们觉得有必要去审视一下代码。encodedDigits()中的代码有点隐晦和难以理解。我们必须深入考虑来发现以下几点:
许多字母没有对应的编码;
encodedDigit()对于上述字母会返回空字符串;
将一个空字符串和encodedDigits()中的变量encodings连接起来没有任何意义。
我们重构一下,以便代码更加明了。首先,对于一个字母,如果encodings表中没有对应的编码,encodedDigit()将返回一个名为NotADigit的常量。然后,在encodedDigits()中增加一个条件表达式,显式地指明NotADigit将被忽略。同时,我们也在lastDigit()中使用这一常量。
c2/34/Soundex.h
➤ const std::string NotADigit{"*"};
std::string encodedDigits(const std::string& word) const {
std::string encoding;
for (auto letter: word) {
if (isComplete(encoding)) break;➤ auto digit = encodedDigit(letter);➤ if (digit != NotADigit && digit != lastDigit(encoding))➤ encoding += digit;
}
return encoding;
}
std::string lastDigit(const std::string& encoding) const {➤ if (encoding.empty()) return NotADigit;
return std::string(1, encoding.back());
}
// ...
std::string encodedDigit(char letter) const {
const std::unordered_map<char, std::string> encodings {
{'b', "1"}, {'f', "1"}, {'p', "1"}, {'v', "1"},
// ...
};
auto it = encodings.find(letter);➤ return it == encodings.end() ? NotADigit : it->second;
}复制代码(上述代码列出了一些增量重构所做的改动,每次改动都经测试验证通过。换句话说,我们并不是一次完成这些改动的。)
让我们继续看一个处理辅音大小写的测试吧!
c2/35/SoundexTest.cpp
TEST_F(SoundexEncoding, IgnoresCaseWhenEncodingConsonants) {
ASSERT_THAT(soundex.encode("BCDL"), Eq(soundex.encode("Bcdl")));}复制代码这里的断言和之前的稍微不同。它声明了对"BCDL"和"Bcdl"的编码结果是一样的。也就是说,我们并不关心实际的编码是什么,只要大写的输入和小写的输入得到的结果一样就行。
我们的解决方案是在查询encodings表时,将字母全部转为小写(在encodedDigit()中)。
c2/35/Soundex.h
std::string encodedDigit(char letter) const {
const std::unordered_map<char, std::string> encodings {
{'b', "1"}, {'f', "1"}, {'p', "1"}, {'v', "1"},
// ...
};➤ auto it = encodings.find(lower(letter));
return it == encodings.end() ? NotADigit : it->second;
}
private:➤ char lower(char c) const {➤ return std::tolower(static_cast<unsigned char>(c));➤ }复制代码我们曾尝试写一个测试来处理第二个字母和第一个字母一样的情形。这又促使我们先将算法改为与大小写无关的。现在,可以回到最初的目标,继续写这个测试了。
c2/36/SoundexTest.cpp
TEST_F(SoundexEncoding, CombinesDuplicateCodesWhen2ndLetterDuplicates1st) {
ASSERT_THAT(soundex.encode("Bbcd"), Eq("B230"));}复制代码我们的解决方案会对encode()的总体策略稍作修改。将整个词传进encodedDigits()进行编码,这样就可以比较第一个字母和第二个字母的编码了。我们只将编码的尾部追加到最终的编码。
在encodedDigits()内部,先将单词的第一个字母编码,这样后续的编码可以与之作比较。由于encodedDigits()现在是编码整个单词,所以我们修改isComplete()以多容纳一个字母。同时,还修改encodedDigits()中的循环,使之遍历整个单词的词尾。
c2/36/Soundex.h
std::string encode(const std::string& word) const {➤ return zeroPad(upperFront(head(word)) + tail(encodedDigits(word)));
}
std::string encodedDigits(const std::string& word) const {
std::string encoding;➤ encoding += encodedDigit(word.front());➤ for (auto letter: tail(word)) {
if (isComplete(encoding)) break;
auto digit = encodedDigit(letter);
if (digit != NotADigit && digit != lastDigit(encoding))
encoding += digit;
}
return encoding;
}
bool isComplete (const std::string& encoding) const {➤ return encoding.length() == MaxCodeLength;
}复制代码函数encodedDigits()变得越来越复杂。为了将相关的语句分组,我们在其间插入了一些空行。这也揭示了此函数做的事情太多了。
单一责任原则(Single Responsibility Principle,SRP)告诉我们,每个函数的改动都是基于一个原因8。encodedDigits()是违反这一原则的典型例子:它把高层的策略与底层的实现细节糅合到一起了。
8参见《敏捷软件开发:原则、模式与实践》。
encodedDigits()通过两个步骤的算法完成其目的。它首先将首字母的编码追加至变量encoding中,然后遍历剩下的字母,追加结果至encoding。问题是,encodedDigits()中还包含了达成这两步的一些底层实现细节。此函数违背了单一责任原则,因为有两个原因会导致要修改它:想要改变实现细节,或需要改变整个编码策略。

泰州企业微信公众号小程序开发公司、泰州企业网页设计方案、泰州做网站开发价格、泰州微信公众号制作运营报价明细表、泰州网站设计公司费用、泰州网站推广大概需要多少钱
服务热线
顶部
备案号: 苏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