免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      再談為什么代碼需要注釋

      前言

      在上篇文章 要不要寫(xiě)代碼注釋 中,我們闡述了為什么代碼需要注釋,但是在評(píng)論區(qū)中,有同學(xué)依然認(rèn)為簡(jiǎn)介明了的代碼不需要注釋。本篇文章,我們通過(guò)舉兩個(gè)例子探討為什么我們認(rèn)為寫(xiě)代碼需要寫(xiě)注釋,歡迎大家給出建議。

      例子一

      同樣的命名,在不同場(chǎng)景下,返回字段含義不同

      我司的業(yè)務(wù)系統(tǒng)中,會(huì)涉及到轉(zhuǎn)碼的業(yè)務(wù),將音視頻、PPT、Word、Excel等文件進(jìn)行轉(zhuǎn)碼,然后使用播放器進(jìn)行播放。在進(jìn)行首抽象時(shí),將轉(zhuǎn)碼后的資源統(tǒng)一抽象成了一個(gè)interface,代碼如下:

      <?phpinterface Resource{ public function getName(); public function getPlayUrl(); public function getType(); public function getLength(); // 其他接口}

      列出的三個(gè)接口,從命名角度上沒(méi)有問(wèn)題,分別表達(dá)的是獲取資源的名稱、獲取資源的播放地址和獲取資源的長(zhǎng)度。

      但是在getLength這個(gè)接口的返回值上,是有歧義的,這個(gè)長(zhǎng)度指的是什么?

      如果是音視頻資源,我們很好理解,90%是指音視頻的時(shí)長(zhǎng),但是單位是秒還是分鐘,不確定。對(duì)于文檔類型的資源呢?首先,對(duì)于一個(gè)剛接觸這套系統(tǒng)的新人而言在不明白文檔資源到底被轉(zhuǎn)碼什么樣子的情況下,他是無(wú)法猜測(cè)其含義的,文檔有可能被轉(zhuǎn)成了視頻、圖片,再或者是其他格式。

      我們的系統(tǒng)會(huì)將文檔資源轉(zhuǎn)成圖片或者h(yuǎn)tml文件,一頁(yè)就是一張圖片或者一個(gè)html文件,這里的getLength,對(duì)于文檔資源來(lái)講,返回的是文檔資源的總頁(yè)數(shù)。

      這里可能有同學(xué)會(huì)質(zhì)疑,為什么不將文檔和音視頻抽象成兩個(gè)不同的資源,針對(duì)文檔類型的,提供getTotalPage接口,獲取頁(yè)數(shù),針對(duì)音視頻類型的,提供getLenght接口,并提取出公共方法抽象成基類?

      <?php// 針對(duì)不同資源進(jìn)行抽象接口示例interface BaseResource { public function getName(); public function getPlayUrl(); public function getType();}interface MediaResource extends BaseResource{ public function getLenght();}interface DocResource extends BaseResource{ public function getTotalPage();}

      原因很簡(jiǎn)單特別簡(jiǎn)單,抽象是為了把復(fù)雜的事情簡(jiǎn)單化,而不是把簡(jiǎn)單的事情復(fù)雜化!

      這個(gè)場(chǎng)景中,除了getLength接口的返回值有歧義,其他接口針對(duì)不同類型資源是沒(méi)有歧義的。如果我們分別進(jìn)行抽象,勢(shì)必會(huì)讓代碼更復(fù)雜,比如引入設(shè)計(jì)模式(工廠或策略,或者兩者皆有)。并且,調(diào)用資源的客戶端,也會(huì)引入條件分支,針對(duì)不同的資源類型,調(diào)用不同的方法。

      ‘MediaResource’, ‘doc’ => ‘DocResource’, ];public static function getResource($type, $resouceId) { if (!isset(self::$map[$type]) { throw new Exception(sprintf(‘Not support type %s’, $type)); } $resClass = self::$map($type); return new $resClass($resourceId); }}// Client端$res = ResourceFactory::getResource($resouceId);if (‘doc’ == $res->getType) {echo ‘資源頁(yè)數(shù)是:’ . $res->getTotalPage();} else { echo ‘音視頻長(zhǎng)度是:’ . $res->getLength() / 60 . ‘分鐘’;}

      本來(lái),我們?cè)黾右痪渥⑨尶梢越鉀Q這個(gè)問(wèn)題。

      <?phpinterface Resource{ public function getName(); public function getPlayUrl(); public function getType(); /** * 對(duì)于流媒體資源,入視頻、音頻等,返回時(shí)長(zhǎng),單位為秒; * 對(duì)于文檔類型資源,返回文檔的頁(yè)數(shù). * * @return int */ public function getLength(); // 其他接口}

      也有同學(xué)會(huì)說(shuō),我不搞復(fù)雜化,所有資源都是getLength接口,具體的返回值,可以看代碼實(shí)現(xiàn)。如果這樣的話,這就會(huì)有以下問(wèn)題,一是違背了好命名的初衷,為什么我們要用好的方法名,就是為了一眼能看出函數(shù)的意圖,二是增加了他人的負(fù)擔(dān),閱讀實(shí)現(xiàn)代碼既費(fèi)時(shí)又痛苦,沒(méi)有隱藏細(xì)節(jié)(關(guān)于隱藏細(xì)節(jié)這個(gè)話題,我們會(huì)單獨(dú)寫(xiě)一篇文章進(jìn)行介紹)。

      代碼無(wú)法表達(dá)一些隱藏的邏輯

      在接觸過(guò)的業(yè)務(wù)中,有一個(gè)學(xué)習(xí)平臺(tái)。對(duì)于課程的設(shè)計(jì)大概是這樣的:

      有一張課程表 course,用于記錄課程的基本信息

      有一張course_member表,用于記錄課程中的用戶,主要字段為課程id course_id和用戶id user_id。

      還有一張 course_learn_record表,用戶記錄用戶學(xué)習(xí)時(shí)長(zhǎng),包含課程id course_id字段、用戶id user_id字段 和學(xué)習(xí)時(shí)長(zhǎng)字段。

      在課程的業(yè)務(wù)中實(shí)現(xiàn)中,有一個(gè)方法,代碼如下

      getCourseMemberDao() ->findCourseMemberIds($courseId); return $this->getCourseLearnRecordDao() ->countLearnTimeByCourseIdAndMemberIds($courseId, $memberIds); } }

      該方法先從 course_member 表中查了一次課程下所有的用戶id,再根據(jù)課程id和用戶id去course_learn_record 表中統(tǒng)計(jì)學(xué)習(xí)時(shí)長(zhǎng)。

      為什么要先查一遍課程的用戶id,再把課程id和用戶id組成與關(guān)系,去course_learn_record表中統(tǒng)計(jì)數(shù)據(jù)呢?單通過(guò)課程id,也可以統(tǒng)計(jì)出課程下所有用戶的學(xué)習(xí)時(shí)長(zhǎng),為何多此一舉?

      原來(lái),業(yè)務(wù)要求,課程的成員可以被移除、也允許被再次添加到課程;當(dāng)成員再次添加到課程的時(shí)候,需要保留之前的學(xué)習(xí)記錄。

      因此,這個(gè)方法統(tǒng)計(jì)的是 課程當(dāng)前成員的學(xué)習(xí)時(shí)長(zhǎng)。

      有同學(xué)會(huì)說(shuō),這明顯是方法命名不對(duì),那什么樣的命名可以體現(xiàn)出這個(gè)邏輯呢?

      我們內(nèi)部有同學(xué)提出了兩個(gè)命名:

      一是 countCourseCurrentMembersLearnTime, 直譯就是統(tǒng)計(jì)課程當(dāng)前成員的學(xué)習(xí)時(shí)長(zhǎng);

      另外一個(gè)是 countCourseValidLearnTime, 直譯是統(tǒng)計(jì)課程有效的學(xué)習(xí)時(shí)長(zhǎng);

      兩個(gè)命名都不好。首先,統(tǒng)計(jì)課程當(dāng)前成員的學(xué)習(xí)時(shí)長(zhǎng),這個(gè)“當(dāng)前”是怎么來(lái)的,為什么會(huì)有當(dāng)前成員這種說(shuō)法,是否還有“非當(dāng)前”的成員存在,對(duì)于不熟悉業(yè)務(wù)的開(kāi)發(fā)同學(xué)來(lái)講,是比較蒙的,可能要問(wèn)一圈才知道為什么。同理,統(tǒng)計(jì)課程有效的學(xué)習(xí)時(shí)長(zhǎng),為什么要區(qū)分有效和無(wú)效,什么情況下有效,什么情況下無(wú)效?

      (PS: 如果你有更好的命名方式,可以貼在評(píng)論區(qū)微笑)

      如果我們給個(gè)注釋,情況就很明了:

      getCourseMemberDao() ->findCourseMemberIds($courseId); return $this->getCourseLearnRecordDao() ->countLearnTimeByCourseIdAndMemberIds($courseId, $memberIds); } }

      總結(jié)

      良好的命名能減少代碼對(duì)注釋的依賴,但仍有大量設(shè)計(jì)信息無(wú)法用代碼表示。

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
      (0)
      用戶投稿
      上一篇 2022年6月21日 06:41
      下一篇 2022年6月21日 06:41

      相關(guān)推薦

      • 反思崔維星的滑鐵盧:中國(guó)“快運(yùn)之王”德邦物流的跨界轉(zhuǎn)型之殤

        2020年,50歲的德邦股份創(chuàng)始人崔維星曾說(shuō):“德邦肯定要做一線,不做一線就沒(méi)有活路?!彼钪?,快遞有規(guī)模效應(yīng),有競(jìng)爭(zhēng)壁壘,是一個(gè)大輸大贏的行業(yè)。 四年前的2018年,崔維星做出了…

        2022年8月23日
      • 正式官宣:moto X30開(kāi)始OTA6公測(cè),重點(diǎn)優(yōu)化這些內(nèi)容

        6月29日,摩托羅拉手機(jī)官微正式發(fā)文宣布,旗下moto X30手機(jī)目前已經(jīng)開(kāi)始OTA6公測(cè),同時(shí)本次Soak公測(cè)將采用用戶手動(dòng)刷新系統(tǒng)更新,先到先得的方式,面向所有用戶的更新需要等…

        2022年7月1日
      • iOS 16 推送更新,可以升級(jí)了

        今日凌晨,蘋(píng)果推送了 iOS 16 的第七個(gè)測(cè)試版系統(tǒng),距離上個(gè)測(cè)試版發(fā)布相隔一周左右,本次更新版本號(hào)為 20A5356a,版本號(hào)以 a 結(jié)尾,也意味著 RC 版已經(jīng)不遠(yuǎn)了。 此前…

        2022年8月25日
      • 《寶可夢(mèng)朱紫》怎么刷努力值?刷努力值方法推薦

        寶可夢(mèng)朱紫中努力值是一項(xiàng)隱藏的數(shù)值,累積努力值可以提升寶可夢(mèng)的屬性。很多玩家想知道寶可夢(mèng)朱紫怎么刷努力值,下面就帶來(lái)寶可夢(mèng)朱紫刷努力值方法推薦,感興趣的小伙伴不要錯(cuò)過(guò),希望能幫助到…

        2022年11月23日
      • 趣店創(chuàng)始人羅敏開(kāi)賣預(yù)制菜 欲借直播電商咸魚(yú)翻身?

        本報(bào)記者 李豪悅 直播電商領(lǐng)域不斷上演奇跡,逐漸成為諸多商業(yè)精英“二次創(chuàng)業(yè)”的新著陸點(diǎn)。 6月15日,趣店創(chuàng)始人羅敏在抖音開(kāi)啟直播,主要宣傳公司的預(yù)制菜。當(dāng)天晚8點(diǎn),記者進(jìn)入直播后…

        2022年6月17日
      • 比某些旗艦機(jī)待遇還好!OPPO這款入門機(jī)型已開(kāi)啟安卓12公測(cè)招募

        對(duì)于安卓手機(jī)來(lái)說(shuō),升級(jí)系統(tǒng)一直是很多用戶的痛。有的廠商在發(fā)布新機(jī)之后,系統(tǒng)升級(jí)仿佛是一錘子買賣,只管生不管養(yǎng)。后續(xù)如果出現(xiàn)了最新的安卓版本,根本不知道什么時(shí)候才能夠用得上。逼著用戶…

        2022年6月28日
      • 好用的播放器(好用的視頻播放器)

        今天小編給各位分享好用的播放器的知識(shí),其中也會(huì)對(duì)好用的視頻播放器進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧! 本文快速導(dǎo)航: 1、電腦播放器哪個(gè)最好用 2…

        2022年10月29日
      • “智進(jìn)·每一程”:小鵬汽車的智能體驗(yàn)超乎想象

        作為智能汽車引領(lǐng)者與未來(lái)出行探索者,小鵬汽車始終堅(jiān)持飽和式研發(fā)投入,保持技術(shù)絕對(duì)領(lǐng)先,讓智能體驗(yàn)進(jìn)化不止。為了讓更多鵬友們體驗(yàn)到小鵬汽車的智能優(yōu)勢(shì),6月10日,小鵬汽車啟動(dòng)IP項(xiàng)目…

        2022年6月13日
      • 榮耀play5活力版和紅米Note 9 Pro哪個(gè)值得入手?

        有朋友前幾天問(wèn)我,這個(gè)618榮耀play5活力版和紅米Note 9 Pro哪個(gè)值得入手?今天有時(shí)間就回答一下這個(gè)問(wèn)題。 在回答這個(gè)問(wèn)題之前首先來(lái)看看榮耀Play5 活力版和Redm…

        2022年6月20日
      • iOS15.6.1正式版推送更新 官網(wǎng)說(shuō)明為安全性更新

        我用的手機(jī)是13和6s。 從15.6更新15.6.1 安裝包并不大,官方說(shuō)明為修復(fù)了安全性問(wèn)題,并建議所有用戶都選擇更新。 小版本更新一般都很贊。 等這個(gè)小版本已經(jīng)等了很久了。 i…

        2022年8月19日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息