收藏此站 联系我们 网站
当前位置:首页» 行业网站案例 » 【建站服务】泰州企业微信公众号小程序开发公司、泰州企业网页设计方案、泰州做网站开发价格、泰州微信公众号制作运营报价明细表、泰州网站设计公司费用、泰州网站推广大概需要多少钱-域名申请

【建站服务】泰州企业微信公众号小程序开发公司、泰州企业网页设计方案、泰州做网站开发价格、泰州微信公众号制作运营报价明细表、泰州网站设计公司费用、泰州网站推广大概需要多少钱-域名申请

作者: 风兰 . 阅读量: 4 . 发表时间:2022-09-20 15:21:46

网站建设

上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


泰州企业微信公众号小程序开发公司、泰州企业网页设计方案、泰州做网站开发价格、泰州微信公众号制作运营报价明细表、泰州网站设计公司费用、泰州网站推广大概需要多少钱


泰州,简称“泰”,古称海陵,是江苏省地级市,长江三角洲中心区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)告诉我们,每个函数的改动都是基于一个原因8encodedDigits()是违反这一原则的典型例子:它把高层的策略与底层的实现细节糅合到一起了。

8参见《敏捷软件开发:原则、模式与实践》。

encodedDigits()通过两个步骤的算法完成其目的。它首先将首字母的编码追加至变量encoding中,然后遍历剩下的字母,追加结果至encoding。问题是,encodedDigits()中还包含了达成这两步的一些底层实现细节。此函数违背了单一责任原则,因为有两个原因会导致要修改它:想要改变实现细节,或需要改变整个编码策略。

c51c866ffa1ab3457f2021e8bbdbcc1.jpg


泰州企业微信公众号小程序开发公司泰州企业网页设计方案泰州做网站开发价格、泰州微信公众号制作运营报价明细表、泰州网站设计公司费用、泰州网站推广大概需要多少钱



上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站

全国服务热线
18114747181
二维码
手机端二维码
上往建站
地址:全国各地都有驻点商务 |  网站建设上往建站
在线咨询QQ:1120768800
 
QQ在线咨询
售前咨询热线
18114747181
营销顾问
营销顾问
售后服务热线
400-000-1116
售后服务
售后服务