当前位置: 网站首页>小程序开发>小程序制作

泰州小程序制作【泰州企业邮箱】泰州网站外包、泰州微信商城开发、泰州网店美工、泰州淘宝设计

发表日期: 2021-04-25 10:59:25 浏览次数:104

泰州小程序制作【泰州企业邮箱】泰州网站外包、泰州微信商城开发、泰州网店美工、泰州淘宝设计

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

丢掉元音

规则1说要丢掉所有的元音以及w、h和y。 由于想不到更好的名字,先称这些字母为元音类字母。

c2/28/SoundexTest.cpp

TEST_F(SoundexEncoding, IgnoresVowelLikeLetters) {
   ASSERT_THAT(soundex.encode("Baeiouhycdl"), Eq("B234"));}复制代码

运行一下测试,发现还没添加产品代码,测试就通过了。这是由于encodedDigit()对于转换表中找不到的字母会返回空字符串。这样,所有的元音就被编码为空字符串了,并且追加到结果字符串。

如果没有改动类定义,测试就通过了,那背后肯定另有故事。可以问自己一个问题:“我在测试中做了与期望不一致的事情吗?”

如果接下来的测试也都继续通过,那么应该考虑回滚掉代码改动。测试提前通过的原因,可能是你的步伐有点大,但这样你可能不会感受到TDD带来的好处。在我们的示例中,本来可以先写一个测试,演示该怎么应对不能识别的字母,这样就可以选择返回相同的字母,而非空字符串。

让测试自我澄清

下一个测试是要处理两个相邻字母有相同数字编码的情形。按照规则3,将用一个数字表示这些字母。这条规则也适用于第一个字母。我们先处理前一种情形,然后再考虑后者。

c2/29/SoundexTest.cpp

TEST_F(SoundexEncoding, CombinesDuplicateEncodings) {
   ASSERT_THAT(soundex.encode("Abfcgdt"), Eq("A123"));}复制代码

这个测试有点让人迷糊!为了理解为什么Abfcgdt编码为A123,我们需要知道b和f都编码为1,c和g编码为2,d和t编码为3。也可以通过阅读其他测试(如ReplacesConsonantsWith AppropriateDigits)来了解这一事实,但或许应该让测试更加直接。

我们添加一些前置条件(precondition)断言,以帮助阅读代码的人建立这种关联。

c2/30/SoundexTest.cpp

   TEST_F(SoundexEncoding, CombinesDuplicateEncodings) {➤    ASSERT_THAT(soundex.encodedDigit('b'), Eq(soundex.encodedDigit('f')));➤    ASSERT_THAT(soundex.encodedDigit('c'), Eq(soundex.encodedDigit('g')));➤    ASSERT_THAT(soundex.encodedDigit('d'), Eq(soundex.encodedDigit('t')));

      ASSERT_THAT(soundex.encode("Abfcgdt"), Eq("A123"));
   }复制代码

前件断言不能通过编译,因为encodeDigit()是私有成员函数。先简单把它声明为公有的成员函数。

c2/30/Soundex.h

 ➤ public:
      std::string encodedDigit(char letter) const {
         // ...
      }➤ private:
      // ...复制代码

我感觉到读者的惊愕了。

提问:不,等一等!你不能把私有函数改成公有的。

回答:我们也有其他的解决方案。可以把测试代码作为Soundex类的友员函数,但是友员往往是一个糟糕的选择,这一点在TDD中也是一样的。可以把这个函数写到另一个类中,譬如SoundexDigitEncoder,但是这似乎过度设计了。也可以不要前置条件断言,而是寻找其他的方法让测试更具可读性。

提问:我们一直被教导不要暴露内部实现细节。你不是也应该遵守此金科玉律吗?

回答:首先,我们不会随意暴露所有的实现,而只是我们需要的。其次,我们没有暴露过多的实现细节以至于影响到Soundex类的公共接口。是的,我们添加了一个产品客户不需要的函数,但是测试需要。所以,滥用的风险是比较低的,换而得之的是,对于以后必须阅读测试的开发者来说,节省了很多时间。

可以在其他写好的测试中使用前置条件断言。但是,尽量不要这样做。通常,使用名称有意义的常量或局部变量是一个简单有效的方案。此外,试图加一个前置条件断言,可能表示你错过了另一个测试。对吧?可以试着添加一个测试,然后看看它是否消去了对前置条件断言的需要。

为了让测试CombinesDuplicateEncodings通过,可以引入一个局部变量,记录最后一个追加的数字,并在每次循环迭代时更新它。但是光一个局部变量似乎模棱两可。我们还是以一个意图明确的声明开始。

c2/31/Soundex.h

   std::string encodedDigits(const std::string& word) const {
      std::string encoding;
      for (auto letter: word) {
         if (isComplete(encoding)) break;➤       if (encodedDigit(letter) != lastDigit(encoding))
            encoding += encodedDigit(letter);
      }
      return encoding;
   }复制代码

我们知道lastDigit()需要做什么。稍微想一想就能找到一个实现的方法。如下:

c2/31/Soundex.h

std::string lastDigit(const std::string& encoding) const {
   if (encoding.empty()) return "";
   return std::string(1, encoding.back());}复制代码

跳出条条框框来测试

现在考虑写下一个测试,其中第二个字母和第一个字母重复。嗯……目前所有测试都是以一个大写字母开始,其余字母是小写,但是这个算法应该是大小写无关的。让我们稍微停一下,先实现一些考虑大小写的测试。(也可以把这个问题加入到测试列表,以后再处理。)

没有指导怎么去处理大小写的规范,但是TDD的好处之一就是,我们可以思考目前手头之外的事情。创建一个健壮的应用程序需要我们能够处理没有明确指明的关键要素。(提示:可以问问你的客户。)

为了能够快速、简单地比较,Soundex算法将类似的词编码至相同的代码。字母的大小写并不影响发音。但为了简化比较Soundex编码,我们将自始至终使用一样的写法。

c2/32/SoundexTest.cpp

TEST_F(SoundexEncoding, UppercasesFirstLetter) {
   ASSERT_THAT(soundex.encode("abcd"), StartsWith("A"));}复制代码

修改一下encode()中的核心算法,将首字母大写,这里我们期待只有一个字母。(upperFront()中的映射操作避免了处理字符串结束符带来的潜在问题。)

c2/32/Soundex.h

   std::string encode(const std::string& word) const {➤    return zeroPad(upperFront(head(word)) + encodedDigits(tail(word)));
   }➤ std::string upperFront(const std::string& string) const {➤    return std::string(1,➤          std::toupper(static_cast<unsigned char>(string.front())));
   }复制代码

有了对大小写的处理,也促使我们去修改测试IgnoresVowelLikeLetters。如上所述,我们期望算法代码可以忽略大小写的元音字母。但是,我们还是想确认一下。为此,更新测试,验证我们的想法。这样看来,我们从TDD跳转到了事后测试的方式。

c51c866ffa1ab3457f2021e8bbdbcc1.jpg



泰州小程序制作泰州企业邮箱泰州网站外包、泰州微信商城开发、泰州网店美工、泰州淘宝设计

400-111-6878
服务热线
顶部

备案号: 苏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