re: 對(duì)臨時(shí)變量的引用 eXile 2008-01-29 12:57
在這個(gè)例子中,s所引用的臨時(shí)變量的生命期和s的生命期是一致的。
gips現(xiàn)在只有高級(jí)會(huì)員能下了啊,而且好象只能用三個(gè)月。。
FROM JAVAEYE:
注釋與文檔的本質(zhì),是為了便于軟件的開(kāi)發(fā)和維護(hù),而不是在一道一道的工序之間作為“交接班”的說(shuō)明
FROM JAVAEYE:
很多大公司的代碼都沒(méi)有任何注釋?zhuān)芏啻髱煂?xiě)代碼也沒(méi)有注釋?zhuān)纯磈unit就知道了,大家可能不知道這個(gè)東西是兩個(gè)大師在飛機(jī)上試驗(yàn)結(jié)對(duì)編程的副產(chǎn)品)。原因在于他們根本就不能容忍任何注釋造成的味道。
FROM JAVAEYE:
實(shí)際上過(guò)多的注釋妨礙了重構(gòu)的進(jìn)行,如果你想讓代碼僵化那么就寫(xiě)大量的注釋好了,越多越好,甚至注釋:代碼=10:1。重構(gòu)的結(jié)果往往是刪除掉大量的注釋?zhuān)驗(yàn)樗鼈兓蛘咭呀?jīng)不適合代碼當(dāng)前的結(jié)構(gòu),或者已經(jīng)不再需要,因?yàn)榇a的結(jié)構(gòu)已經(jīng)非常清晰了。而且我并不知道是否還有可能進(jìn)行下一次重構(gòu),那么我寫(xiě)太多的注釋是不是很有可能是在做無(wú)用功?我其實(shí)只要寫(xiě)很少量的注釋就足夠了。
FROM JAVAEYE:
就說(shuō)注釋好了,比較一下:
1。可運(yùn)行的代碼
2。測(cè)試代碼的單元測(cè)試和其他測(cè)試
3。注釋
這個(gè)重要性應(yīng)該是向下遞減的。沒(méi)有1,其他都沒(méi)有意義了。沒(méi)有2,就沒(méi)有一種可執(zhí)行、可重復(fù)的方法來(lái)驗(yàn)證1的正確性。
至于注釋?zhuān)瑢?duì)于程序的功能、正確性和可靠性,對(duì)于客戶(hù)來(lái)說(shuō)是沒(méi)有任何意義的,所以除非有特殊的理由,我們才去寫(xiě)注釋。
一般來(lái)說(shuō),堅(jiān)持寫(xiě)注釋的人最重要的觀點(diǎn)是便于自己或后來(lái)者理解代碼,減小程序維護(hù)和變更的成本。這個(gè)我們當(dāng)然喜歡,但是要注意幾點(diǎn):
1。注釋到底是不是最好的工具來(lái)加快和精確理解
2。達(dá)到這樣的目的需要多少成本
第一點(diǎn),首先絕大多數(shù)注釋是細(xì)節(jié)程度上的,基本上和代碼本身處于同一層次,因此我們需要看一看代碼本身是否比注釋更有權(quán)利。
注釋的目的基本上是為了說(shuō)明
1:代碼實(shí)現(xiàn)中的權(quán)衡
2。代碼本身的目的
3:別的代碼使用該代碼的方法
以Java舉例,注釋包括包注釋、類(lèi)注釋和方法注釋。在99%的情況下,我認(rèn)為只有包注釋和類(lèi)注釋才有意義,因?yàn)橐粋€(gè)包和
類(lèi)只有自己的名字來(lái)解釋自己的含義,如果是一個(gè)簡(jiǎn)單的類(lèi),譬如說(shuō)是Rectangle,當(dāng)然這個(gè)名字已經(jīng)說(shuō)明了一切。但很多時(shí)候,
一個(gè)類(lèi)里面包含很多方法,很難簡(jiǎn)單地用一個(gè)類(lèi)名字來(lái)描述整個(gè)類(lèi)的意圖和作用這個(gè)時(shí)候,這個(gè)時(shí)候代碼本身是不足的,需要類(lèi)注釋的。
對(duì)于方法層次上的注釋?zhuān)悄氵@個(gè)方法用了非常復(fù)雜的算法,那么我們最先關(guān)注的是它的目的,這個(gè)目的用方法的名字就足夠了,
如果你認(rèn)為它有三個(gè)目的,或者有幾個(gè)階段,那你必須重構(gòu),直到達(dá)到這個(gè)目標(biāo)。這里代碼比注釋的好處是能夠優(yōu)化代碼本身的結(jié)構(gòu),
易于重用和新變化,沒(méi)有同步的成本,更重要的是它是可執(zhí)行的。
有的時(shí)候,例如內(nèi)部實(shí)現(xiàn)是錯(cuò)誤的,我們需要修改代碼,這個(gè)時(shí)候我們也需要理解這個(gè)代碼地實(shí)現(xiàn)方式,但我認(rèn)為一旦達(dá)到了上面的要求,對(duì)一個(gè)程序員來(lái)講,代碼更精確、更簡(jiǎn)單地能夠被理解,而不是注釋?zhuān)亲⑨屩鹦薪忉尨a地實(shí)現(xiàn)。
至于別的代碼如何來(lái)使用你自己的代碼,我不由得回憶起當(dāng)初學(xué)習(xí)delphi地經(jīng)歷,在我使用一段delphi以后,我很多時(shí)候都是憑自己對(duì)delphi函數(shù)命名的習(xí)慣的猜測(cè)去調(diào)用一個(gè)個(gè)函數(shù),而不是依靠delphi地API文檔和delphi源代碼里面的注釋?zhuān)▽?shí)際上非常少),真的無(wú)法理解就去看源代碼。而對(duì)于一些我完全是初學(xué)的類(lèi)或者函數(shù),我的做法首先是去尋找范例代碼理解函數(shù)調(diào)用的順序,至于這種理解是否正確
最終取決于我自己的不斷測(cè)試。對(duì)于一些復(fù)雜的方法,我會(huì)在基本已經(jīng)理解,并且能夠使用的情況下再去看是否還有別的什么"訣竅",后門(mén)等等。因此,在這方面單元測(cè)試無(wú)疑比注釋更有用,但是如果一個(gè)方法確實(shí)比較復(fù)雜,并且不同地類(lèi)和函數(shù)之間有一定的依賴(lài)關(guān)系,我們需要專(zhuān)門(mén)的API文檔,注釋根本做不到這一點(diǎn)。
第二點(diǎn),注釋的成本。注釋無(wú)法驗(yàn)證,注釋不能執(zhí)行。因此,注釋必須完全通過(guò)手工來(lái)進(jìn)行維護(hù),當(dāng)一個(gè)類(lèi)被重構(gòu)為一個(gè)類(lèi)層次,
當(dāng)一個(gè)方法被抽取成兩個(gè)方法,當(dāng)一個(gè)類(lèi)的某些方法被移到另一個(gè)類(lèi),一個(gè)類(lèi)地實(shí)現(xiàn)被改變(接口不變)的時(shí)候我們都必須手工去維護(hù)
這些東西,并且無(wú)法知道我們的注釋到底是不是正確揭示了這個(gè)類(lèi)、方法的意圖和實(shí)現(xiàn)思路。這個(gè)成本是非常高的,特別是當(dāng)我們
知道注釋既不能為客戶(hù)提高更多的價(jià)值,也不會(huì)對(duì)其他程序員理解代碼有多大的幫助。當(dāng)然,如果我們有足夠的人力、物力愿意干這樣的活,有些時(shí)候也會(huì)稍微有點(diǎn)幫助。
JAVAEYE上真是有不少明言警句啊, 看來(lái)都是高手。。。
FROM JAVAEYE:
閱讀有些test case只能讓你云里霧里,而閱讀有些則讓你馬上就知道這段代碼的用途。其實(shí)找并不是這些test case寫(xiě)的有水平差別,而往往是有針對(duì)問(wèn)題角度的差別。而進(jìn)一步,你會(huì)發(fā)現(xiàn)閱讀這些test case如果按照一定順序,就會(huì)從最初的動(dòng)機(jī)到最終的實(shí)現(xiàn)細(xì)節(jié)都有一個(gè)清晰的理解,而如果我們能夠在寫(xiě)這些test case的時(shí)候就標(biāo)注出這個(gè)理解順序,將是十分核算的。而實(shí)際上很多時(shí)候我們書(shū)寫(xiě)的順序就是最終我們適于閱讀理解的順序。
FROM JAVAEYE
就是因?yàn)椤拔臋n/注釋”在代碼的頻繁修改中太容易過(guò)時(shí),而且也太容易為人所忘記,所以在我的實(shí)踐中不寫(xiě)文檔,我的文檔就是我的“代碼+單元測(cè)試”,想知道我的想法,看“代碼+單元測(cè)試”就行了,沒(méi)有任何形式的文檔比“代碼+單元測(cè)試”更能體現(xiàn)我的設(shè)計(jì)
- 我們的文檔是十分簡(jiǎn)短和松散的,一般放在wiki上,起到story guide的作用,但如上所說(shuō),隨著開(kāi)發(fā)很快就過(guò)時(shí)了,從中你能找到設(shè)計(jì)的逐步迭代,但它和最終的產(chǎn)品是有差別的
- 對(duì)于我們開(kāi)發(fā)工程師來(lái)講,“代碼+單元測(cè)試”就是我們的文檔,對(duì)于客戶(hù)來(lái)講,有專(zhuān)門(mén)的產(chǎn)品文檔供他們使用,但是那是由文檔工程師寫(xiě)的
FROM JAVAEYE:
對(duì)于大多數(shù)的中國(guó)的軟件開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō),難以實(shí)現(xiàn)敏捷的最重要問(wèn)題是人的素質(zhì)問(wèn)題。一個(gè)敏捷團(tuán)隊(duì)要求每個(gè)成員都有較好的OOP和OOD的能力。.......實(shí)現(xiàn)敏捷是一個(gè)漸進(jìn)的過(guò)程。構(gòu)造一個(gè)在技術(shù)上有敏捷能力的團(tuán)隊(duì)有兩種方法,一是用足夠的錢(qián)去招聘有足夠能力的程序員(大部分企業(yè)沒(méi)有那么多錢(qián))。二是將現(xiàn)有不符合敏捷技術(shù)要求的程序員培養(yǎng)為合格的敏捷工作者。而在培養(yǎng)的路上,單元測(cè)試正是一個(gè)很好的驅(qū)動(dòng)方式和實(shí)踐平臺(tái)。
@neoragex2002
這個(gè)老兄還是對(duì)TDD有一個(gè)起碼的了解以后,再來(lái)討論這個(gè)問(wèn)題吧。
re: 異步回調(diào)的一種封裝 eXile 2008-01-23 16:33
只要是原創(chuàng)的,發(fā)在幾個(gè)blog也無(wú)所謂啊,獨(dú)家不獨(dú)家的有什么關(guān)系呢
而且你的這種實(shí)現(xiàn)存在死鎖的可能性, 即使不死鎖,也會(huì)使線程反復(fù)切換,效率不高
這種辦法很容易導(dǎo)致寫(xiě)?zhàn)囸I...
一般來(lái)說(shuō)寫(xiě)的優(yōu)先級(jí)應(yīng)該比讀高一些
修正了一個(gè)bug ( signal.h: 92)
template<...>
class signal
{
//....
template <class T>
void connect(SP_NS::shared_ptr<T> const& f)
{
_connect(slot_type(f.get()), f);
}
};
@weiliang
Re : 對(duì)象屬性 編輯控件 ?
在qt solution中已實(shí)現(xiàn)了這種控件,安裝后即可使用
另外, 保證你的模塊不出差錯(cuò), 不是靠文檔和注釋, 而是靠測(cè)試,
文檔和注釋,也分兩種, 一種是給自己看的, 一種是給別人看的, 這兩種寫(xiě)法是不一樣的,
對(duì)于寫(xiě)給自己看的文檔, 如果會(huì)影響開(kāi)發(fā)進(jìn)度的話,為什么要寫(xiě)它呢?這說(shuō)明寫(xiě)文檔的方法不對(duì).
我覺(jué)得, 好象你理解的設(shè)計(jì)總在變化這句話有偏差, 設(shè)計(jì)變化的原因主要有兩點(diǎn):
1) 需求的變化, 主要是系統(tǒng)功能的改進(jìn), 擴(kuò)充, 版本的升級(jí)
2) 需求的細(xì)化, 主要是需求本身不會(huì)考慮到所有的實(shí)現(xiàn)細(xì)節(jié), 在實(shí)現(xiàn)時(shí)才發(fā)現(xiàn)有設(shè)計(jì)不當(dāng)?shù)牡胤?
這個(gè)問(wèn)題, 稱(chēng)之為重構(gòu).
在沒(méi)有單元測(cè)試的保證下, 進(jìn)行重構(gòu)是一種危險(xiǎn)的行為. 正如你說(shuō)的一樣, 要指望不出問(wèn)題, 那是奇跡. 這也不能怪軟件工程沒(méi)學(xué)好, 因?yàn)槲覀儗W(xué)的軟件工程本身就是有缺陷的.
"把需求看好、文檔寫(xiě)好、時(shí)間安排好,這才是硬道理…… "
這是不對(duì)的, 設(shè)計(jì)的唯一不變的特點(diǎn)就是: 它總是在變化.
--是不是有點(diǎn)有饒口 :) , 這是<<設(shè)計(jì)模式Head First>>中的一句話.
所以我們做的, 是如何應(yīng)對(duì)變化.
推薦看一下: <<重構(gòu),改善既有代碼的設(shè)計(jì)>>
其實(shí)qmake很方便的,有了qmake,我都很少使用IDE了。
個(gè)人認(rèn)為boost現(xiàn)有的signal 實(shí)現(xiàn)并不怎么樣, 應(yīng)該在下一個(gè)版本中有較大的更新。
再來(lái)解釋一下,使用trackable是為了把它作為一個(gè)基類(lèi),trackable對(duì)象銷(xiāo)毀時(shí),能自動(dòng)斷開(kāi)相關(guān)連接。而connection的設(shè)計(jì)是因?yàn)閎oost::function并不能也無(wú)法提供一致的相等性比較,所以用connection來(lái)管理slot 的連接。當(dāng)然設(shè)計(jì)的關(guān)鍵之處是還是要防止懸掛指針的出現(xiàn),所以slot管理器并不直接操作slot的實(shí)例。
SQLite現(xiàn)在的版本可以加密了嗎?我好象在它的文檔里沒(méi)有找到相關(guān)說(shuō)明啊?
這篇文章說(shuō)的還是socket編程的模型。
使用ACE,主要用的還是Reactor或Proacoter框架,到那時(shí),還認(rèn)為ACE不難的,那都是高手。。。
有一定道理。不過(guò)如果D再成熟一些的話,選擇D+wxD 也不錯(cuò)。
在c++中,應(yīng)用設(shè)計(jì)模式卻不使用智能指針,內(nèi)存管理遲早會(huì)變成一件極其痛苦的事情, 孟巖(?)甚至說(shuō)在C++中不使用shared_ptr,就不要談面向?qū)ο笤O(shè)計(jì)。。。
@力為
呵呵,如果MFC也跨平臺(tái),唯一的可能就是Windows已經(jīng)失去了大部分江山。。
遺憾啊,對(duì)eXtreme 比較熟....
@fr3@K
這就要看CTest 是值語(yǔ)義還是指針語(yǔ)義了,對(duì)于指針語(yǔ)義,我覺(jué)得最好采用第二種接口類(lèi)辦法,這樣概念上不會(huì)混淆,也便于將來(lái)派生新的功能。
1)Adapter: 使風(fēng)格統(tǒng)一, 不受外來(lái)庫(kù)API的污染,
使 2)Bridge:用beta版的lib開(kāi)發(fā)軟件,或者是開(kāi)發(fā)所依賴(lài)的庫(kù)有較大的可能 在軟件的生命期內(nèi)發(fā)生改變時(shí),通常使用該模式
這些確實(shí)需要有時(shí)間和實(shí)踐來(lái)理解,才能有深刻的體會(huì)。。。
QSettings有它自己的序列化機(jī)制,要控制它的編碼方式,最好還是用自己的INI配置類(lèi)吧。
re: 漢語(yǔ)編程++ eXile 2007-10-18 17:44
信息產(chǎn)業(yè)部教育中心總工程師沈林興把五筆字型輸入法、漢字激光照排系統(tǒng)和漢語(yǔ)編程作為漢字在計(jì)算機(jī)應(yīng)用中的三大里程碑,“而漢語(yǔ)編程更具革命性意義。”他欣喜地看到
這一顛覆已經(jīng)悄然開(kāi)始。
近日,用漢語(yǔ)編程實(shí)現(xiàn)的數(shù)據(jù)庫(kù)開(kāi)發(fā)環(huán)境將通過(guò)江蘇省科技廳的驗(yàn)收。按照進(jìn)程,漢語(yǔ)程序設(shè)計(jì)語(yǔ)言數(shù)據(jù)庫(kù)開(kāi)發(fā)環(huán)境項(xiàng)目完成后一年,項(xiàng)目承擔(dān)方——南京漢語(yǔ)編程有限公司將以漢語(yǔ)編程數(shù)據(jù)庫(kù)教育版為推廣重點(diǎn)并進(jìn)行其他工程開(kāi)發(fā)。項(xiàng)目完成后兩年,漢語(yǔ)編程數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)版將以O(shè)EM方式與國(guó)內(nèi)PC制造商捆綁銷(xiāo)售。項(xiàng)目完成后三年,將推出漢語(yǔ)編程數(shù)據(jù)庫(kù)企業(yè)版參與政府、企業(yè)、部隊(duì)信息化建設(shè),部分替代進(jìn)口產(chǎn)品。
江蘇省科技廳將對(duì)該項(xiàng)目投資三百萬(wàn)元。
同樣看好漢語(yǔ)編程的還有重慶市科委,他們的預(yù)期投資是上千萬(wàn)。漢語(yǔ)編程作為重大科技發(fā)明發(fā)現(xiàn)正在申請(qǐng)重慶市的國(guó)家級(jí)項(xiàng)目。
重慶藥監(jiān)局正在應(yīng)用漢語(yǔ)編程開(kāi)發(fā)的數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)所有下屬藥店的監(jiān)管。目前這個(gè)項(xiàng)目完成了大部分,6月底將最后完工。
re: 漢語(yǔ)編程++ eXile 2007-10-18 16:47
不許笑,這個(gè)可曾經(jīng)是某政府投資幾千萬(wàn)搞的項(xiàng)目, 據(jù)說(shuō)是要搞中國(guó)人自己的編程語(yǔ)言。。。
weak_ptr的主要目的是為了解決引用計(jì)數(shù)的循環(huán)引用問(wèn)題
boost 出于線程安全的考慮,并沒(méi)有為weak_ptr提供->重載或get方法,所以不能直接使用, 還得轉(zhuǎn)化成shared_ptr
@xiehp@sohu.com
這就是 it++ 和 ++it 的區(qū)別
@missdeer
那就應(yīng)該分析一下測(cè)試的環(huán)境. 看一下有連接時(shí),無(wú)連接時(shí), 局域網(wǎng)中, 公網(wǎng)中.
asio本身帶的例子是很簡(jiǎn)單的, 都是用法演示,最多也就服務(wù)器設(shè)定幾個(gè)線程.
在局域網(wǎng)中進(jìn)行這樣的測(cè)試是沒(méi)有什么意義的.
boost 的 thread 和asio都是有可能作為系統(tǒng)支持庫(kù)進(jìn)入std::tr2的.
剛準(zhǔn)備自己寫(xiě)一個(gè)呢, 真是超爽啊, 太謝謝了....
asio本身并不占用多少資源, 如果網(wǎng)絡(luò)連接數(shù)不多,但占用CPU很厲害, 那肯定時(shí)是自己寫(xiě)的程序某個(gè)地方出了問(wèn)題.
至于Observer::update(void*)可以利用ObserverAdapter實(shí)現(xiàn)接口強(qiáng)制,再利用 std::tr1::tuple 之類(lèi)的來(lái)彌補(bǔ)類(lèi)型信息的不足
發(fā)現(xiàn)這種設(shè)計(jì)還有兩個(gè)優(yōu)點(diǎn):
(1)observer雖然用于解藕很不錯(cuò),但是在C++中,最大的問(wèn)題是容易出現(xiàn)懸掛指針,而且出現(xiàn)后不易調(diào)試。這個(gè)實(shí)現(xiàn)在這一方面做得很不錯(cuò),可以最大限度的防止這類(lèi)問(wèn)題的出現(xiàn)。
(2)由于定義了抽象接口,很容易擴(kuò)充為線程安全的實(shí)現(xiàn)
re: 談?wù)劜灰粯拥膕ingleton eXile 2007-09-15 11:58
不錯(cuò), 和我的做法一樣.
看來(lái)D的編譯速度已經(jīng)超出了某些人的想象極限.......
(1)
http://qiezi.javaeye.com/blog/26685
D語(yǔ)言編譯速度非常快(這也是Walter Bright對(duì)C++不滿的一個(gè)重要原因)。dsource.org中的mango項(xiàng)目包含755個(gè)D源文件,但在我的機(jī)器上編譯成.lib文件只需要4秒時(shí)間。
(2)
D is not a scripting language, nor an interpreted language. It doesn't come with a VM