[聲明]:本英文資料源自于Herb Sutter 創建的“Conversation”欄目,“C++ 翻譯小組”的翻譯作品供學習交流與參考用途,不得用于任何商業用途。未經Herb Sutter、Jim Hyslop同意,不得轉載;對于違反以上條款,翻譯小組對此不負任何責任;特此聲明。
文章來源:http://www.gotw.ca |
舞廳里異常安靜。
我們完全沒料到會發生這種情況。不管怎樣,對于怎么離開這地方,我們一點頭緒都沒有?,F在已經是進攻部隊侵入我們在木衛二冰層下的外星城內據點的第二天了,而我們在地面上的部隊卻是鞭長莫及,無法給予我們幫助。吉爾伯下令撤入舞廳,并在門口設置障礙。房間很大,但幸運的是它的入口很少。一些隊友離開了我們,乘著撤退時秩序混亂干脆投降了。我和珍妮就沒這個機會,我們被吉爾伯和他的官員們看得緊緊的。
舞廳里很冷,而且越來越冷。吉爾伯同意打開兩只便攜式取暖器,因為我們所帶的電池一年也用不完。溫度明顯回升了。
我們同時帶上了幾個外星文物,插上了電,但仍顯得很神秘,我們剛剛才把它們激活,根本沒有時間進行實驗。雅格跟我們在一起,他可是個重要人物,他比其他人更懂這個神秘古城的文字。
這三個十英尺直徑的金屬球仍掛在半空中,每個仍展示不同的圖象:微黃的草地,附近有些象樹一樣的東西;黃昏時刻的沙灘;象這個房間一樣的金屬屋,有很多柜子,我們曾看到的那個瞪著我們的灰袍人現在已經跑掉了。他沒再回來,也沒其它人出現。我們知道把小東西扔進球里也就是把它們添加到圖象中;我們開始想到金屬球會不會是“大門”,便把一節用過的電池扔向草地,它碰了碰樹狀物,在草地蹦了幾下,然后就不動了。電池仍在我們的視野之中,沒有什么東西朝它撲去,它自己也沒什么反應。
我把頭轉向珍妮,我們談論其它一些寒冷而又安靜的時刻,這有助于分散我們的注意力。此時,雅格在房間的另一端繼續仔細地對其中一種文物進行實驗,希望能起一點作用。
- - - - - - - - - - - - - - - - - - - - - - - - -
辦公室內非常安靜。
這并沒有出乎意料。不管怎樣,今天是二月二日,許多人都去渡假了。我正在折騰一些小型的程序代碼,這也是我計劃好的,因為我現時的狀態不適合搞大型的程序。
我剛剛接到一些有關“內部庫”的開發要求,雖然并不是什么了不起的大項目,但我還是頗感興奮。你知道,我們的公司并沒有單獨成立正式的小組來開發供整個公司使用的基礎軟件庫。雖然我認為這種庫很有意義,但對這種組織風格并不感冒,相信Guru也是如此。不過,我們已經擁有一些基于一般東西的內部庫,由一些工程所共享。這些內部庫并沒有單獨的“主人”,但項目的增加和修改由其中一位經驗豐富的開發人員進行審查。如果我們寫了一些可供重用的候選內容,就將其提交給共享庫。偶爾,有人會請求增加某種特性,通常該特性在共享區尚未提供,但可能是內部庫應該具備的。如果有誰自信有這個能耐,就接受這個請求,寫出解決方案。
所以,當我被冠之為“可能有這個能耐”,受邀為內部庫寫一個擴展的東西時,自然是頗感興奮。我感到興奮的另一個原因是他們從沒請鮑勃來干。這讓我有了一點驕傲的資本。唉!年輕人的虛榮啊。
問題看上去很簡單:“寫一個ConvertBase函數,它接受一個表示基數為N的數字的string,將其轉換為另一個string,代表的是相同的數字,可基數換成了M?!?BR>
我的第一感覺是寫一個硬編碼的解決方案,就象下面這樣:
string ConvertBase( size_t base1, size_t base2,
const string& src )
{
long value = 0;
// 從src中讀入基數base1。
for( int i = 0; i < src.size(); ++i )
{
// if src[i]是一個有效的base1字符,
// 將值乘以base1,然后加上下一個數字;
// else if src[i]是空格break;
// else 拋出一個邏輯錯誤;
}
// 將基數base2數值寫到dest
string dest;
while( value > 0 )
{
// 找到最高位的base2數字,
// 添加到dest,
// 適當地減小數值。
}
}
正當我埋頭琢磨,尚未寫完最后一行注釋時,耳后傳來一聲溫和的清嗓子的聲音,我意識到Guru來了。
我神情嚴峻,周圍一片沉寂。
接著我聽到沙沙的翻書聲,不用回頭我就知道,Guru把筆擱在書中,又合上了書。然后是她平靜而又低沉的聲音:“傍晚好,我的孩子?!?BR>
“啊,傍晚好,老師,”我回答道。如果她擺出了那副滑稽的架子,那鮑勃肯定在附近,這副模樣對于成功地嚇唬鮑勃是非常重要的。
“你的代碼,”她擺著手勢,圍著我踱著步,審視著顯示器,并用筆在其上比劃著,“跟247號請求驚人地相似?!?BR>
“哦,是的,就是它,”我承認,“這正是我的工作內容??瓷先タ赡軙愕帽容^長?!?BR>
她若有所思地點點頭,并不吭聲。過了一會,她補充道:“你是否注意過314號請求?!?BR>
“哦,嗯……沒有?!蔽依蠈嵆姓J。
“這沒什么,314號請求要求一種從文本流中讀寫一個任意基數的數字的方法。我想編寫314號請求代碼的人最終跟你現在所寫的會差不多。我能提個建議嗎,徒弟?”
“真的,你希望我順便把314號請求也完成了?”我問道,希望在我心中升起。如果說受邀寫一個共享庫方法是一種榮耀的話,想想在這么短的時間內連續受邀編寫兩個又是何等風光??!
“是的,但并不是馬上,”Guru說道,理了理耳后一絡灰白的頭發?!熬幊逃幸粋€原則:我們經常能夠在我們的代碼中通過首先編寫測試例來獲得有益的見識。貝克、福勒、馬丁和另一些人將這個信條傳播給任何會聆聽的人,也傳播給許多不想理會的人。在這個例子里,假如你已經有了一些跟314號請求有關的代碼,為什么不為247號請求寫些代碼呢,為247號請求寫一個簡單的測試例,可以從314號請求的主干代碼中做些修改,能讓測試例通過編譯。最后,你從247號請求的代碼中歸納出314號請求的解決方案應該采用的形式,確認這種形式可以被提出314號請求的人所接受,然后就是具體的編碼了?!?BR>
我眨了眨眼,“我想我明白你的意思了。我首先在247號請求中提出使用了314號請求中尚未完成的那部分方法,這樣我就可以看一下314號請求的方法應該是怎樣的,對不對?”
“對!”
“OK,”我略作沉吟,接著在鍵盤上忙碌起來。我可以假定我已經有一個“能夠從一個文本流中讀寫任意基數的數值的方法”。對,我如果有了這玩意,我可以使用流在各個基數之間相互翻譯。深思熟慮之后,我最終敲定如下代碼:
string ConvertBase( size_t base1, size_t base2,
const string& src )
{
stringstream s1( src );
long value;
if( !( s1 >> Num( base1, value ) ) ||
!( s1 >> std::ws ).eof() )
throw logic_error
( "src is not a valid number" );
stringstream s2;
if( !( s2 << Num( base2, value ) ) )
throw logic_error
( "unexpected error emitting converted number" );
return s2.str();
}
接著我又寫了一個簡單的測試例,簡單地提供足夠的Num樁模塊,使這個例子能通過編譯:
class Num
{
public:
Num( size_t base, long& value ) :
base_(base), value_(value) { }
size_t Base() const { return base_; }
long& Value() { return value_; }
private:
size_t base_;
long& value_;
};
istream& operator>>( istream& i, Num& n )
{
string s;
i >> s;
// todo: really convert input to n´s base_
// todo: 真正將輸入轉換為基數為n的數值。
n.value_ = 255;
return o;
}
ostream& operator<<( ostream& o, const Num& /* n */ )
{
// todo: really output n.value_ in n.base_
// todo: 真正以n.base為基數將n.value輸出
return o << "FF";
}
int main()
{
string result = ConvertBase( 10, 16, "255" );
cout << result << endl;
return result == "FF" ? 0 : 1;
}
編譯器只抓到幾個打字錯誤,改正之后,我心滿意足地看到這辦法確實管用。接下來,我知道必須為314號請求弄出完整的方案,也就是真正實現Num中的<<和>>操作。
我看了看表,下班時間早過了,但還能趕上車,不會誤了跟安娜的約會。314號請求嘛,明天再說嘍。
- - - - - - - - - - - - - - - - - - - - - - - - -
我看了看表,早就過了該我們去睡的時間,我們還緊去睡。門的另一邊不時傳來敲擊聲,大概是入侵部隊在砸門,但目前還沒有更多的動作。這些奇怪的球或大門可以挨到早晨,除非有進一步的情況發生。雖然吉爾伯的手下仍在嘗試使用我們的便攜式通訊儀,試圖與地面上取得聯系,或者與我不知道的過往船只聯系,但我有一種感覺,大門是我們唯一的出路。
Herb Sutter 是個獨立顧問,也是ISO/ANSI C++標準委員會的秘書。你可通過hsutter@acm.org.聯系他 |
Jim Hyslop Leitch Technology International Inc.資深的軟件設計師,你可通過jim.hyslop@leitch.com聯系他 |
原文轉自:http://www.anti-gravitydesign.com