泰州微信公众号开发【泰州网络推广】泰州建站、泰州网站维护、泰州网页制作、泰州微信小程序代运营公司-小程序制作-网站建设【企业网站制作|网页设计】- 高端网站建设 - 书生商友信息科技-

全国热线:400-111-6878

网站建设推广专家

泰州微信公众号开发【泰州网络推广】泰州建站、泰州网站维护、泰州网页制作、泰州微信小程序代运营公司

发表日期: 2021-04-25 10:53:33 浏览次数:141

泰州微信公众号开发【泰州网络推广】泰州建站、泰州网站维护、泰州网页制作、泰州微信小程序代运营公司

泰州,简称“泰”,古称海陵,是江苏省地级市,长江三角洲中心区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,所以不能用变量去掉这个硬编码。我们可以引入另一个常量,或从一个名副其实的函数中返回一个常量。

甚至可以先不管这个硬编码,待到下一个测试时再消除它。但是我们能保证在集成代码前写下一个测试吗?万一我们转去做其他事情了呢?那个时候再回头看这段代码,或许要花费更多的时间来理解它了。请保持增量交付的态度,现在就来解决问题!

c51c866ffa1ab3457f2021e8bbdbcc1.jpg

泰州微信公众号开发泰州网络推广泰州建站、泰州网站维护、泰州网页制作、泰州微信小程序代运营公司

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