起一個好名字,意味著賦予事物一個承載意義、期望與身份的符號,并借此為其未來的發(fā)展鋪設(shè)一條充滿可能性的道路。它不僅僅是一個稱呼,更是一種深遠(yuǎn)的祝福、一個無聲的預(yù)言、一個身份認(rèn)同的起點,其象征未來的意義體現(xiàn)在以下幾個方面: 1. 承載期望與愿景: 個人: 父母給孩子取名,往往寄托著對孩子未來的期望(如“志遠(yuǎn)”、“嘉慧”、“安然”)、對品德的期許(如“仁杰”、“守信”、“思齊”)、對人生狀態(tài)的祝愿(如“樂康”、“欣悅”、“安寧”)或?qū)易鍌鞒械难永m(xù)(如特定的字輩、紀(jì)念先祖)。 企業(yè)/品牌: 一個好的公司或品牌名稱,需要體現(xiàn)其核心價值(如“誠信”、“創(chuàng)新”)、市場定位(如“高端”、“親民”)、行業(yè)特性(如“迅捷”、“穩(wěn)健”)以及未來的發(fā)展藍(lán)圖(如“環(huán)球”、“未來”、“領(lǐng)航”)。 項目/活動: 名稱需要清晰傳達(dá)項目/活動的目標(biāo)(如“曙光計劃”、“春風(fēng)行動”)、核心理念(如“和諧共生”、“智慧未來”)以及想要實現(xiàn)的積極影響。 2. 塑造第一印象與身份認(rèn)同: 名字是“第一張名片”: 一個恰當(dāng)、響亮、富有內(nèi)涵的名字能迅速在他人心中建立積極的初步印象,激發(fā)好奇心和好感度。這為未來的互動和關(guān)系建立打下了基礎(chǔ)。 定義身份核心: 名字是個人、組織或事物最核心的身份標(biāo)識。它幫助確立“我是誰”、“我們代表什么”。一個強大的名字能強化內(nèi)部成員的歸屬感和自豪感,也幫助外界快速理解其本質(zhì)。 3. 蘊含潛力與可能性: “名正則言順”: 一個寓意積極、方向明確的名字,仿佛為未來的發(fā)展指明了一個方向。它像一個無形的燈塔,引導(dǎo)著個體或組織朝著名字所蘊含的美好愿景努力。 激發(fā)內(nèi)在動力: 一個充滿力量和希望的名字,本身就能對擁有者(人或組織)產(chǎn)生積極的暗示和心理激勵,鼓勵其努力去“配得上”這個名字所代表的品質(zhì)和未來。 4. 象征連接與傳承: 連接過去與未來: 名字常常承載著歷史(家族姓氏、文化典故)、當(dāng)下(時代特征、父母心境)和對未來的展望。它像一個紐帶,連接著起源和歸宿。 建立情感紐帶: 一個被用心賦予、飽含深情的名字,能建立起擁有者與命名者(如父母與孩子)之間深厚的情感聯(lián)系。這份情感是未來關(guān)系的重要基石。 傳承價值: 名字中蘊含的價值觀(如勇敢、智慧、仁愛)或精神(如探索、堅韌、合作)是希望在未來得以延續(xù)和發(fā)揚光大的。 5. 在市場中建立差異化與價值: 品牌資產(chǎn)的核心: 在商業(yè)領(lǐng)域,一個好的名字是品牌最核心的無形資產(chǎn)之一。它幫助在擁擠的市場中脫穎而出,建立獨特的品牌形象,承載品牌承諾,并最終影響消費者未來的購買決策和忠誠度。一個有遠(yuǎn)見的名字能為品牌未來的價值增長奠定基礎(chǔ)。 總結(jié)來說,“起一個好名字意味著什么,象征著未來”的核心在于: 意味著: 深思熟慮地注入期望、定義身份、賦予意義、建立連接、并期望其成為未來發(fā)展的重要助力。 象征著: 一個充滿希望的起點、一個有待實現(xiàn)的藍(lán)圖、一種無形的引導(dǎo)力量、以及一份承載著祝福與責(zé)任的傳承。 它是對未來潛力的一種具象化表達(dá)和積極召喚。 因此,起名絕非隨意之舉,而是一項面向未來的、充滿創(chuàng)造力和責(zé)任感的儀式。一個好的名字,如同一顆精心挑選的種子,蘊含著破土而出、茁壯成長、最終綻放出美好未來的無限可能。它既是當(dāng)下的承諾,也是通往未來的第一聲回響。

店名測試打分免費測試?店名測試打分免費測試吉兇!

朋友們,我來了~

今天這一章還是講測試,基于屬性的測試(Property-Based Testing)。其實我感覺叫隨機驗證測試更通俗易懂一點。

我們?nèi)粘W约簻y試的時候,會有一個問題,就是我們既是裁判,也是球員。因為我們的程序就是順著我們的思路寫的,測試也是按照同樣的思路來測試的。所以,我們可能通常很難測出我們自己寫出來的bug。

解決這個問題的一個辦法,就是把測試交給其他人。這也是測試這個崗位存在的意義之一。但是,如果我們把測試交給了其他人,上一章提到的,對測試的思考可以幫助更好地設(shè)計程序,這個好處就不存在了。

基于屬性測試

解決這個問題的辦法就是,把其他人,換成我們的計算機,讓計算機來幫我們自動測試。

之前關(guān)于契約或者合約(Contract)那一章中,提到了要給程序制定一個合同,規(guī)定了輸入的規(guī)則、輸出的規(guī)則、以及不變量(比如給一個數(shù)組排序,進(jìn)去和出來的數(shù)組長度應(yīng)該是不變的)。

那么合約和不變量在這里統(tǒng)稱為屬性(property),很抽象是不是?個人覺得它的定義并不重要,舉個例子就懂了。

比如我們要驗證一個list的排序,我們可以驗證這兩件事:1.輸入和輸出的list長度是否相等;2.是不是list里的每一個都比它前面一個大。

python寫出來就是這樣:

from hypothesis import given
import hypothesis.strategies as some

@given(some.lists(some.Integers()))
def test_list_size_is_invariant_across_sorting(a_list):
original_length = len(a_list)
a_list.sort()
assert len(a_list) == original_length

@given(some.lists(some.text()))
def test_sorted_result_is_ordered(a_list):
a_list.sort()
for i in range(len(a_list) – 1):
assert a_list[i] <= a_list[i + 1]

更重要的是,它利用了hypothesis這個模塊,@given(some.lists(some.integers()))會讓它在運行的時候,利用隨機的數(shù)值把同樣的方法運行100次。它會把出現(xiàn)錯誤的情況記錄下來。

對數(shù)器

之前在學(xué)習(xí)算法的時候,也接觸到了一個叫做對數(shù)器的概念,其實和這里的基于屬性測試,基本上是一件事情。

就是為了驗證我們的算法A寫對了,我們先寫一個絕對正確的算法B,不管效率,只管正確。然后用同樣的數(shù)據(jù)同時跑算法A和算法B。當(dāng)然也是隨機跑很多次啦。如果兩個出現(xiàn)了不同的結(jié)果,那就說明算法A寫錯了。

思路基本相同,只不過,相對來說,可能這個基于屬性測試更嚴(yán)謹(jǐn)一點,比如,同樣是排序算法,我用我寫的冒泡排序算法來驗證我的選擇排序算法,萬一,我的冒泡排序也寫錯了呢?但是,如果我直接從根本上解析出排序(正序)就是后一個比前一個大,顯然是更不容易出問題的,其實也能更進(jìn)一步地鍛煉我們尋找根本問題的能力。

當(dāng)然啦,嚴(yán)格意義上來說,比較后一個比前一個大,這個本身也是一種算法。

實話說,要思考清楚有哪些屬性是要測試的,這件事本身就充滿了難度。如果你平時沒有這個習(xí)慣,突然讓你想,你會大腦一片空白的,就像是剛學(xué)編程那會,遇到了一個需求完全不知道從哪里下手的那種感覺。坦白的說,我現(xiàn)在就是這種狀態(tài),想必這也是需要刻意練習(xí)的。

這種隨機大量測試的方式,可以幫助我們測出一些邊界值,測出一些我們想不到的情況。往往最容易出問題的地方也是在邊界值的地方。就跟開車似的,車開起來了,通常都沒什么問題,但是起步可能會熄火,停車可能會倒不進(jìn)去。

Java的相關(guān)框架

關(guān)于這個基于屬性測試的框架,我隨手搜了一搜,Python有的,沒理由咱們Java沒有,對不對?

一、找到兩個github上開源:

1.https://github.com/HypothesisWorks/hypothesis-java

2.https://github.com/quicktheories/QuickTheories

二、找到一個都已經(jīng)有自己網(wǎng)站的(雖然也有g(shù)ithub):

https://jqwik.net/

三、還有一個直接是JUnit家的JUnit-Quickcheck(感覺上這個更香一點)

https://github.com/pholser/junit-quickcheck

我還沒來得及仔細(xì)研究,朋友們可以先自行研究起來~

另一個實例

書中其實還提到了另外一個更加實際一點的例子,但我個人覺得那算不上bug,它和實際的需求有關(guān)系。這邊簡單提一下吧,或許你也有不同的見解。

大概就是有一個倉庫類,它可以存放各種貨品,不同貨品有各自的數(shù)量,大概是這樣一個結(jié)構(gòu)吧:List<Map<String,Integer>>。然后我們可以查詢某個貨品是否有庫存、查詢某個貨品還剩多少庫存、可以從中取出某個數(shù)量的貨品。

代碼如下:

class Warehouse:
def __init__(self, stock):
self.stock = stock

def in_stock(self, item_name):
return (item_name in self.stock) and (self.stock[item_name] > 0)

def take_from_stock(self, item_name, quantity):
if quantity <= self.stock[item_name]:
self.stock[item_name] -= quantity
else:
raise Exception("Oversold {}".format(item_name))

def stock_count(self, item_name):
return self.stock[item_name]

倉庫的初始化是這樣的:

wh = Warehouse({"shoes": 10, "hats": 2, "umbrellas": 0})

然后,同樣用了hypothesis來做批量測試,然后在調(diào)用take_from_stock( item_name='hats', quantity=3)這樣一組數(shù)據(jù)的時候報錯了。

作者說,在in_stock我們不應(yīng)該只判斷庫存是不是大于0,而是要判斷它有沒有包含我們要拿取的貨品數(shù)。代碼應(yīng)該改成這樣:

def in_stock(self, item_name, quantity):
return (item_name in self.stock) and (self.stock[item_name] >= quantity)

反正我是覺得這不算個bug吧,畢竟在真正獲取貨品的時候,就報錯了呀。要看我們對于in_stock這個方法本身的要怎么定義咯,是只需要知道它還有沒有庫存,還是需要知道它有沒有我需要的庫存。

雖然實際需求中,后者可能性更大,但是在take_from_stock方法里報錯,又有什么問題呢?(又或者,作者只是想舉個例子,是我太較真了)

尾聲

基于屬性的測試是對于單元測試的補充,對于單元測試的思考,可以讓我們思考代碼實現(xiàn)的其他方式?;趯傩缘臏y試,可以讓我們更加清晰,我們的方法能干什么不能干什么,同時,也消除一些意外的情況。

如果,你還沒有把這兩種測試用起來,現(xiàn)在就趕緊用起來吧~

本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 673862431@qq.com 舉報,一經(jīng)查實,本站將立刻刪除。
如若轉(zhuǎn)載,請注明出處:http://www.51zclw.cn/archives/25944