我發現,過去2-3個參數,有能力記住所有的函數參數都受到影響。隨着它的可理解性。
傳遞命名參數可以提供幫助。具有方便散列式文字語法的語言使得這非常簡單。以JavaScript的:
g = new Gundam00();
g.fight({opponent: enemy, casualties: 'numerous'});
您也可以利用可變長度參數特徵來解決這個(治療奇怪的論點姓名,甚至參數作爲實際參數)。
g.fight('opponent',enemy,'casualties', 'numerous');
某些語言實際支持命名的參數直(見:http://en.wikipedia.org/wiki/Named_parameter#Use_in_programming_languages)。
最後,您可能需要考慮添加其他方法,使用一些稱爲Fluent接口(http://en.wikipedia.org/wiki/Fluent_interface)的方法。基本上,你有方法調用它返回的對象本身,這樣你就可以調用鏈在一起:
g.opponent(enemy).casualties('numerous').fight();
,如果你在一個明顯/靜態類型類爲重點的語言工作,這可能是最簡單的選項。
更新
應對剎那的評論......在最後一個例子,如果你有奢侈,你可以像opponent
和casualties
簡單的setter方法不影響任何內部狀態或除了設置他們命名的參數之外的其他方式進行計算。他們只是簡單地設置內部屬性,然後所有的實際工作都發生在像fight
這樣的動作方法中。如果你不能這麼做(或者如果你不喜歡編寫操作是次原子的方法的話),你可以用這種類似散列的字面意思放在這個想法之間的一箇中間點,並且創建自己的集合類專門用於調用命名參數:
n = new NArgs();
g.fight(n.arg('opponent',enemy).arg('casualties','numerous').arg('motion','slow'));
多一點笨拙,但是它分離出來的命名參數的問題,可以讓你保持你的方法有點多個原子,並NARGS是可能是你可以實現很簡單,只是圍繞一種類型的集合(HashTable?)或另一種可用的語言包裝某些方法。
看到這個http://stackoverflow.com/questions/965690/java-optional-parameters – 2010-06-28 00:53:21