OLID 原則最初是由 Bob 在他的《敏捷軟件開發(fā):原則、模式和實踐》一書中提出的,它們旨在使軟件設(shè)計更易于理解、靈活和可維護(hù)。它們是原則不是規(guī)則更不是完美的真理。然而它們確實是很好的建議。
原則是精神上的小房間。他們給一個概念命名,這樣你就可以談?wù)摵屯评磉@個概念。它們提供了一個地方來表達(dá)我們對好代碼和壞代碼的感受。他們試圖將這些感受歸類為具體的建議。從這個意義上說,這些原則是一種鎮(zhèn)痛劑。給定一些您感覺不好的代碼或設(shè)計,您可能能夠找到一個原則來解釋這種不好的感覺并建議您如何感覺更好。
單一責(zé)任原則
這個原則背后的想法是我們需要將不同的職責(zé)分成不同的類,我們有下面的代碼來說明 User 類:
這個例子的問題是 User 類必須管理兩個不同的職責(zé):
這會產(chǎn)生維持穩(wěn)定性的問題,在使用過程中,我們可能會有多種理由修改這個類,比如更換一個更換的Log方法,這樣就影響了本不應(yīng)該被改變的User類邏輯,從而產(chǎn)生了不必要的風(fēng)險。最好的方式就是,將職責(zé)分開,User類專門負(fù)責(zé)User的邏輯,Log類專門管理Log。
開放封閉原則(The Open Closed Principle)
代碼在開發(fā)過程中不會保持永久穩(wěn)定,一直都在變化,我們編寫的所有代碼都會在未來的某個時刻發(fā)生變化,因此我們需要創(chuàng)建更容易的代碼。
我們更改代碼的方式將定義代碼質(zhì)量,如果我們不斷更改當(dāng)前的類,這將在我們的代碼中產(chǎn)生錯誤,但是如果我們用新的類擴(kuò)展我們的類,這將有助于我們避免代碼中的錯誤,那就是 OCP原理的主要思想。
如果我們想添加一個新的三明治尺寸,例如巨型,我們需要編輯 Sandwich 類,并可能破壞其他東西,如果我們將此列表委托給另一個類并從 Sandwich 類加載這個類,我們將在未來進(jìn)行維護(hù) 更簡單、更安全:
現(xiàn)在我們通過 Sandwich 類中的 setSize 方法連接了 2 個不同的類,無論我們要添加多少尺寸,我們都不需要再編輯 Sandwich 類,這就是 OCP 原理的精髓。
里氏替換原則
這個定義并不能幫助我們更快地理解這個原則的含義,但是這個想法很簡單:一個父類可以被一個派生類替換而不會破壞它的行為。即:一個對象在其出現(xiàn)的任何地方,都可以用子類實例做替換,并且不會導(dǎo)致程序的錯誤。
下面的代碼是一個派生類破壞父類行為的經(jīng)典示例:
這里的問題是, 正方形不應(yīng)該是長方形的子類。原因是正方形多了一個屬性“長==寬”。這時,對正方形類設(shè)置不同的長和寬,計算面積的結(jié)果是最后設(shè)置那項的平方,而不是長*寬,從而發(fā)生了與長方形不一致的行為。如果程序依賴了長方形的面積計算方式,并使用正方形替換了長方形,實際表現(xiàn)與預(yù)期不符。所以應(yīng)該將他們寫成兩個單獨的類。
接口分離原則
接口隔離原則表明客戶端不應(yīng)該被強(qiáng)迫實現(xiàn)一些他們不會使用的接口,應(yīng)該把冗余接口中的方法分組,然后用多個接口替代它,每個接口服務(wù)于一個子模塊。簡單地說,就是使用多個專門的接口比使用單個接口要好很多。
看下面的例子:
在這個例子中,Product 類中的方法 setName 總是要求用戶發(fā)送 onFinish 函數(shù),即使用戶不需要調(diào)用這個函數(shù),這樣實現(xiàn)更好:
依賴倒置原則
這個原則有兩點:
這里的想法是創(chuàng)建一種方法來減少我們的類對其他類的依賴,從而更容易替換對其他類的依賴。讓我們分析下面的代碼:
在此示例中,我們將 Client 類與 ValidateEmailSimple 緊密耦合,每次調(diào)用 setEmail 時,我們都會從 ValidateEmailSimple 創(chuàng)建一個新實例,這里的問題是,當(dāng)您決定將此驗證更改為另一個更復(fù)雜的驗證(ValidateEmailAdvanced)時,您將需要更改客戶端類中所有出現(xiàn)的舊驗證系統(tǒng),這可能會在我們的應(yīng)用程序中產(chǎn)生新的錯誤和不一致。
解決這個問題的方案就是把這種緊耦合的依賴轉(zhuǎn)化為松耦合的依賴,怎么做呢? 很簡單,讓我們在 Client 類中創(chuàng)建一個名為 _emailValidationService 的 var,并調(diào)用它來驗證我們的電子郵件,而不是直接調(diào)用我們需要的驗證類:
使用這種方法,當(dāng)我們決定放置一個更高級的驗證電子郵件系統(tǒng)時,我們不需要更改 Client 類,很酷吧?
歡迎轉(zhuǎn)發(fā),感謝閱讀!
年以來,隨著疫情方面的數(shù)據(jù)逐漸增多,一些互聯(lián)網(wǎng)公司也紛紛發(fā)布一些可視化的數(shù)據(jù)產(chǎn)品服務(wù),讓用戶可以實時并直觀了解最新情況,可謂一個便民利器。而本文,則通過丁香醫(yī)生、以及騰訊新聞推出的“疫情實時動態(tài)”可視化服務(wù),總結(jié)分享其中運(yùn)用到的一些常見的數(shù)據(jù)可視化經(jīng)驗。
閱讀指南:
(1)受眾人群:初級產(chǎn)品經(jīng)理
(2)閱讀收獲
首先,需要先簡單澄清下數(shù)據(jù)可視化的基本概念。數(shù)據(jù)可視化,實質(zhì)上是把一些概要信息(數(shù)據(jù)、關(guān)鍵內(nèi)容),并結(jié)合動靜態(tài)的圖像視頻等形式進(jìn)行展示,從而清晰傳遞核心信息。較為注重視覺層面的觸達(dá)。
所以我們需要在數(shù)據(jù)之中挖掘一些重要的價值信息,并以一個可觀的方式呈現(xiàn)。而“重要”的定義是十分明顯的,核心數(shù)據(jù)、用戶感興趣、有決策意義,都可稱之為重要。
根據(jù)馬斯洛五層次需求理論,那么數(shù)據(jù)可視化在其中屬于什么層次的需求?
受疫情影響,生命安全成了最重要的社會需求。那么滿足大眾對這方面的廣泛需求,推出這樣的數(shù)據(jù)可視化產(chǎn)品是十分有必要,滿足用戶對疫情情況、資訊信息、醫(yī)療信息等方面的獲取,從而保障自己基本的需求。
(1)脈絡(luò)
初始,丁香醫(yī)生率先推出一個H5的可視化頁面,匯總披露病例數(shù)據(jù)。隨后,一些大廠也開始陸續(xù)推出,包括頭條、騰訊等等。
而為什么大家都紛紛推出這樣的數(shù)據(jù)服務(wù),從戰(zhàn)略層來說:一是做好企業(yè)責(zé)任,滿足用戶的知情需求;其二是滿足自己的平臺用戶,并吸引流量,這都是拉新、促活的寶貴方式。
而展示的信息,主要包括每日的新增、累計病例數(shù),各地區(qū)的病例分布,以及疫情新聞、醫(yī)學(xué)知識等方面的內(nèi)容。
(2)價值
而接下來,也將依據(jù)用戶體驗五要素中的范圍層、框架層、表現(xiàn)層,分別對這個疫情數(shù)據(jù)可視化的產(chǎn)品服務(wù)進(jìn)行分析。
范圍層的定義是決定這樣的產(chǎn)品服務(wù)需要提供什么范圍內(nèi)的功能服務(wù),什么是不做的。以及要做的數(shù)據(jù)指標(biāo),哪些是關(guān)鍵的,哪些是次要的。所以我們可以羅列一下這樣數(shù)據(jù)可視化產(chǎn)品,基于用戶的需求是需要準(zhǔn)備什么樣的數(shù)據(jù)指標(biāo)。
上圖摘自國家衛(wèi)健委某日的全日數(shù)據(jù),在制作可視化的時候,需要考慮數(shù)據(jù)源的出處以及能提供什么樣的指標(biāo)及口徑。
從中可以看出,大致可以劃分兩類關(guān)鍵數(shù)據(jù):一個是病例的數(shù)據(jù),一個是輔助性的數(shù)據(jù)。我們需要從中挑出其適合展示同時也是用戶需要關(guān)心的數(shù)據(jù)。
通常做這種可視化產(chǎn)品,總結(jié)性的數(shù)據(jù)是十分關(guān)鍵的。而基于用戶的關(guān)注點,每日新增、累計,就是其中的關(guān)鍵。
另外,基于“時間”和“地區(qū)”,代表了數(shù)據(jù)的“屬性”。而屬性則反應(yīng)了這個數(shù)據(jù)可以以什么樣的特點進(jìn)行展現(xiàn)。而“時間”和“地區(qū)”是,最適合以數(shù)據(jù)趨勢和數(shù)據(jù)分布的兩種主要數(shù)據(jù)可視化表達(dá)形式。
從下表可以看出,3家平臺的數(shù)據(jù)指標(biāo)在展示上是比較一致的,核心指標(biāo)都一一羅列展示。
其中在時間的“小時”級別,以及“解除醫(yī)學(xué)觀察”等細(xì)分指標(biāo)都不做展示,我認(rèn)為主要出于以下目的:
框架層的定義是指根據(jù)要做的功能范圍,應(yīng)該確定如何正確布局和設(shè)計,可以簡單理解為PPT的排版一樣,以什么樣的方式來排列展現(xiàn)這些元素。
首先,我們需要先看看上文提及到的幾類數(shù)據(jù)指標(biāo),重新分類一下,并標(biāo)記相應(yīng)的優(yōu)先級。
顯然按照合理的布局應(yīng)該是:
大致的布局是已經(jīng)清晰了,那么接下來就需要基于數(shù)據(jù)類型采用合理的可視化展示形式。
前面也提過,由于是時間和地區(qū)下的各類數(shù)據(jù),基于這樣的屬性,是可以做趨勢、地域、列表等分布的展示方式。支持趨勢的圖形則主要為折線、柱狀圖,支持地域分布類型則為地圖,而列表則為常規(guī)的類報表方式等。
其中,由于時間跨度較長和地區(qū)明細(xì)較多,如果使用柱狀圖,則會顯得橫軸較長,所以在有限的手機(jī)屏幕尺寸下,是不適宜展示的。
(Echarts部分地圖特性截圖)
所以在這里,更傾向于采用粗一些的2D省級行政地圖形式,開發(fā)周期短,且滿足最基本需求。
(1)匯總數(shù)據(jù)
相同點:
差異點:
評價:正常應(yīng)遵循“標(biāo)題+具體數(shù)值+較昨日變化”這樣的排列比較合適,上下順序先從標(biāo)題了解該指標(biāo)的含義,居中放大具體數(shù)值,突出關(guān)鍵信息,其次顯示較昨日變化對比,感知變化情況。
(2)各指標(biāo)趨勢
相同點:
差異點:
(3)國內(nèi)各省市分布
相同點:統(tǒng)一以常規(guī)列表分布展示國內(nèi)各省市的疫情數(shù)據(jù)情況,并集中以地區(qū)、確診、死亡、治愈等字段。
差異點:
評價:
(4)海外各國分布
展示方式如國內(nèi)疫情一致,這里不多說。而唯一不同的是,丁香醫(yī)生在全球各國的基礎(chǔ)做了“洲”單位的分類。這樣的好處是,分類顯得更有層次性,了解某個范圍內(nèi)的地區(qū)更有顯著性。
表現(xiàn)層所關(guān)注的,是頁面各個元素組件的形狀、色彩和大小比例搭配。同時數(shù)據(jù)可視化十分重視圖形色彩的表達(dá),一個好的視覺設(shè)計,能夠為數(shù)據(jù)的信息傳遞起到十分重要的作用。
從上圖可以看出,3家平臺都展示了4個關(guān)鍵指標(biāo)“確診”、“疑似”、“死亡”和“治愈”,以及在色彩選擇上,盡管有具體色值的差別,但是理念是都較為接近的。
地圖分布通常是以顏色深淺代表數(shù)據(jù)的“密集程度”,那么就要確定2個關(guān)鍵的地方,1個是色系,另外1個是合理的刻度比例。前者根據(jù)數(shù)據(jù)內(nèi)涵確定合適的色系進(jìn)行表達(dá),后者是做色系的層次區(qū)分。
以上就是此次疫情數(shù)據(jù)下,在可視化應(yīng)用上的一些體驗總結(jié),3家都遵循了一些基本原則,同時也有各自的一些風(fēng)格。而數(shù)據(jù)可視化的應(yīng)用需要兼顧不同的因素,達(dá)到最佳效果。
一個理想的可視化設(shè)計流程,需要經(jīng)歷“數(shù)據(jù)指標(biāo)的范圍篩選、頁面的布局抉擇、可視化的視覺設(shè)計“等關(guān)鍵步驟。
3家平臺地址:
丁香醫(yī)生:https://ncov.dxy.cn/ncovh5/view/pneumonia
:https://i.snssdk.com/ugc/hotboard_fe/hot_list/template/hot_list/forum_tab.html?activeWidget=1&city_code=440300&city_name=%E6%B7%B1%E5%9C%B3&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_ios&utm_campaign=client_share&wxshare_count=1
騰訊新聞:https://news.qq.com/zt2020/page/feiyan.htm?devid=EB886059-83CA-4F1F-AB3A-B64FCD87D7F7&qimei=eb886059-83ca-4f1f-ab3a-b64fcd87d7f7
作者:A.D,數(shù)據(jù)產(chǎn)品一枚;公眾號:吾某
本文由 @A.D. 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。
題圖來自Unsplash,基于CC0協(xié)議。
器之心報道
編輯:力元、蛋醬
不要對 Python 4.0 抱有希望,可能不會有的。——Python 之父 Guido van Rossum
2020 年 1 月 1 日,Python 官方結(jié)束了對 Python 2 的維護(hù),意味著 Python 2 完全退休,進(jìn)入 Python 3 時代。之后,關(guān)于 Python 4 的發(fā)布排期也成為了社區(qū)的熱門議題。
去年,Python 之父 Van Rossum 在推特上表示,假如會有 Python 4,從 3 到 4 的版本過渡會更像從 1 到 2 的過渡,而不會像從 2 到 3 的過渡。
但在最近接受 Microsoft Reactor 采訪時,Van Rossum 被問及 Python 的未來,以及什么時候會出 Python 4.0。他卻表示,可能不會有 Python 4 了。
Van Rossum 回答說:「我和 Python 核心開發(fā)團(tuán)隊的成員對 Python 4.0 沒什么想法,提不起興趣,估計至少會一直編號到 3.33。」
視頻地址:https://www.youtube.com/watch?v=aYbNh3NS7jA
在從 Python 2 過渡到 Python 3 時已經(jīng)被上了一課的 Van Rossum 表示,在內(nèi)部的嚴(yán)肅場合,談?wù)?Python 4 是個禁忌,大家只會在飲茶時把 Python 4 當(dāng)玩笑開。
2020 年 4 月,Python 2.7 生命周期中的最后一個版本 - Python 2.7.18 發(fā)布了。彼時 Van Rossum 警告過開發(fā)人員 Python 3 與 Python 2 不兼容,因此基于 Python 2 的軟件庫依賴項將不能升級至版本 3.0。
那是一個延續(xù)了數(shù)年之久,緩慢而又痛苦的遷移期。Van Rossum 說:「實際上,Python 比核心開發(fā)人員意識到的要成功得多,因此我們應(yīng)該對從 Python 2 過渡到 Python3 更加了解和支持。但當(dāng)時我們錯誤地認(rèn)為過渡會很簡單,因為我們都像 Python 編程中的愛因斯坦一樣,可以在睡眠中將代碼從 Python 2 轉(zhuǎn)換為 Python3。」
不過,Van Rossum 并沒有完全排除 Python 4.0 的可能性,他暗示道,當(dāng) Python 與 C 的兼容性發(fā)生重大變化時,可能會改變目前的想法。Van Rossum 表示:「如果不更改語言就會與 C 擴(kuò)展存在嚴(yán)重的不兼容,或者我們能夠擺脫全局解釋器鎖(GIL),這樣的情況下我們可能被迫升級至 Python4.0。」
然而,關(guān)于預(yù)計在 10 月發(fā)布的 Python 3.10,以及將實現(xiàn)一些重大速度提升的版本 3.11,Van Rossum 強(qiáng)調(diào),重點依舊是盡可能長時間地漸進(jìn)式的更新編程語言。
兩年前,Guido van Rossum 從 Dropbox 離職,宣布退休,但又在 2020 年 11 月加入了微軟,主動結(jié)束了自己的退休生活。當(dāng)時他表示,將致力于「使用戶更好地使用 Python(并且不僅僅是在 Windows 系統(tǒng)上)」。
「現(xiàn)在,我們有一個嚴(yán)格的年度發(fā)布時間表,Python 3.10 之后是 3.11,之后是 3.12,依此類推。(在 Python 4 之前)我們必須先發(fā)布 3.9,每次添加另一個數(shù)字并不是容易的事,但仍然比從 3 到 4 輕松得多。」
「Python 的加速是漸進(jìn)式的,3.11 版本會有新的速度提升,我們會在 3.12 和 3.13 中將其進(jìn)一步提高。」
接下來,讓 Python 更快是 Python 核心開發(fā)團(tuán)隊的工作重點。在近日的 PyCon Language Summit 上,Van Rossum 宣布目標(biāo)是在 3.11 版本中將 CPython 的性能提高一倍。
Van Rossum 還介紹了通過外部項目(比如 Pyston)來加速語言的努力,Pyston 項目是 Python 3.8.8 的實現(xiàn),該實現(xiàn)最初發(fā)布在 Dropbox,后來開源。其創(chuàng)建者最近發(fā)布了 Pyston 2.2,相比 CPython 3.8.8 的性能提高了 30%。
「現(xiàn)在,我覺得大約有一年時間來證明我們在 Python 性能上取得了進(jìn)步,3.11 會比 3.10 快得多。」
同時,Van Rossum 也分享了自己對其他編程語言的看法,他欣賞 Rust 改進(jìn) C++ 代碼的能力,并且 Go 是「比較 Python」的語言中最有趣的。
「你可能注意到,在過去的六七年里,我們一直在 Python 中添加可選的靜態(tài)類型,也叫漸進(jìn)類型。」Python 之父也介紹了 Python 近年來對 TypeScript 的重視程度。
「當(dāng)開始項目時,我實際上并不了解 TypeScript,所以我不能說最初是受到了 TypeScript 的啟發(fā)…… 如今,我們肯定是以 TypeScript 為樣板,有時我們發(fā)布了新功能,因為某些功能相對 Typescript 是缺失的,然后我們根據(jù)用戶需求將其進(jìn)行添加,非常成功。」
Van Rossum 說,Python 仍然在努力尋找重獲成功的方法。在他看來,Hejlsberg 是一個非常聰明的人,TypeScript 正在做的一些事情,是 Python 未來需要弄清楚的。實際上 TypeScript 也在向 Python 學(xué)習(xí),就像 JavaScript 在一些領(lǐng)域從 Python 那里學(xué)習(xí)一樣。
參考鏈接:https://www.tectalk.co/why-python-4-0-might-never-arrive-according-to-its-creator/
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。