泰州400电话办理【泰州网站公司】泰州百度优化、泰州域名注册、泰州网店美工、泰州微信公众号托管-小程序制作-网站建设【企业网站制作|网页设计】- 高端网站建设 - 书生商友信息科技-

全国热线:400-111-6878

网站建设推广专家

泰州400电话办理【泰州网站公司】泰州百度优化、泰州域名注册、泰州网店美工、泰州微信公众号托管

发表日期: 2021-04-25 10:57:14 浏览次数:113

泰州400电话办理【泰州网站公司】泰州百度优化、泰州域名注册、泰州网店美工、泰州微信公众号托管


泰州,简称“泰”,古称海陵,是江苏省地级市,长江三角洲中心区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月,被评为全国双拥模范城(县)。

那测试呢?ReplacesConsonantsWithAppropriateDigits中需要3个断言吗?为了回答这个问题,先自问额外的测试是否能增加对此功能特性的理解。答案应该是不能。所以,去掉两个断言,将剩下的断言改用ASSERT_THAT,并选择一个不同的辅音来编码,以此增加我们的信心。

c2/20/SoundexTest.cpp

   TEST_F(SoundexEncoding, ReplacesConsonantsWithAppropriateDigits) {➤    ASSERT_THAT(soundex.encode("Ax"), Eq("A200"));
   }复制代码

如果出现别的情况呢

目前的实现假定能够在encodings映射中找到传入encodedDigit()的字母。之前是为了能慢慢向前推进开发,故作此假设,因为这样就可以写最少的代码来通过每个测试。但是,依然要思考可能需要写的其他代码。

有没有可能传入encodedDigit()的字母没有出现在查找映射中?如果可能,该怎么应对?维基百科并不能回答这个问题。我们可以猜,但是最好的答案来自客户。如果没有客户,可以在网上搜索一下,搜索会马上给出一堆Soundex应用。输入A#会得到A000。答案有了:需要忽略不能识别的字母。

在TDD中,我们可以记下这个既定测试的名称,或者现在就动手写这个测试。有几次我发现提前写一些例外情形的测试,会节省后来调试的时间。所以,现在就来写这个测试吧!

c2/21/SoundexTest.cpp

TEST_F(SoundexEncoding, IgnoresNonAlphabetics) {
   ASSERT_THAT(soundex.encode("A#"), Eq("A000"));}复制代码

运行这个测试,你会发现测试不是失败了,而是崩溃了。find()返回了指向end()的迭代器,而我们却尝试解引用。当遇到这种情形,先修改一下encodedDigit(),返回一个空字符串。

c2/21/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(letter);➤    return it == encodings.end() ? "" : it->second;
   }复制代码

一次只做一件事

我们需要测试驱动开发出代码用以转换一个词末尾剩下的字母。

c2/22/SoundexTest.cpp

TEST_F(SoundexEncoding, ReplacesMultipleConsonantsWithDigits) {
   ASSERT_THAT(soundex.encode("Acdl"), Eq("A234"));}复制代码

一个简单的方法是:除了第一个字母,遍历剩下的字母并转换。但是,目前的代码结构还不太容易支持这么做。先重构下代码吧!

但是记住,一次只做一件事。在测试驱动开发时,要保持每一步都不同。在写测试时,不要跑去重构。同样,在尝试让测试通过时也不要重构。将两件事并在一起做时,一旦出岔子会浪费时间。而且这肯定会发生的。

先把刚才写的测试注释掉,暂时停止这个测试。(在Google Mock中,在测试名称前加DISABLE_前缀会跳过执行测试。)

c2/23/SoundexTest.cpp

➤ TEST_F(SoundexEncoding, DISABLED_ReplacesMultipleConsonantsWithDigits) {
      ASSERT_THAT(soundex.encode("Acdl"), Eq("A234"));
   }复制代码

我们先专注于重构,修改一下目前的解决方案。不要将整个词传入encodedDigits(),而是将词尾(除了第一个字母外的其余字母)传入encodedDigits()。这样做会让循环处理待转换字母的代码更简洁。同时,使用empty()front()函数有助于澄清代码的意图。

c2/23/Soundex.h

      std::string encode(const std::string& word) const {➤       return zeroPad(head(word) + encodedDigits(tail(word)));
      }
   private:
      // ...➤    std::string tail(const std::string& word) const {➤       return word.substr(1);➤    }

      std::string encodedDigits(const std::string& word) const {➤       if (word.empty()) return "";➤       return encodedDigit(word.front());
      }复制代码

完成后,运行一下所有的测试,以确保改动不会破坏其他测试。至此,重构工作可以告一段落了。

回到TDD周期的开始,重新启用ReplacesMultipleConsonantsWithDigits,使其失败。可以使用一个基于范围(range)的for循环来遍历词尾,让测试通过。

c2/24/Soundex.h

   std::string encodedDigits(const std::string& word) const {
      if (word.empty()) return "";➤    std::string encoding;➤    for (auto letter: word) encoding += encodedDigit(letter);➤    return encoding;
   }复制代码

既然在encodedDigits()中加入了循环,就不用应对传入空字符串之类的防御语句了。在重构环节中,移除它。

c51c866ffa1ab3457f2021e8bbdbcc1.jpg

泰州400电话办理泰州网站公司泰州百度优化、泰州域名注册、泰州网店美工、泰州微信公众号托管

上一条:泰州网站推广【泰州办理400电话】泰州SEO优化、泰州微信公众号APP客户端小程序开发、泰州网站托管、泰州APP开发
下一条:泰州网站优化【泰州开通400电话】泰州网站搭建、泰州微信公众号推文外包、泰州开通京东拼多多设计、泰州淘宝装修
网站制作
小程序制作
网站优化
网站开发
400电话办理
网络推广
网站建设
网店装修
微信公众号开发
网页设计
网络公司
域名企业邮箱
服务器空间
网站案例报价
百科问答
编辑排版美工
App软件开发
百度推广
代运营托管
logo设计
网络全网营销
网站备案
网站定制
小程序开发公司
首页
电话
立即预约