関数の適切な長さとは? マーチン・ファウラー氏は、長さより意図と実装の分離、そしてよい関数名が重要だと指摘
http://www.publickey1.jp/blog/17/post_262.html
探検
マーチン・ファウラーのプログラミングバンザイ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/01/30(月) 23:33:00.67
2017/01/30(月) 23:34:25.38
いくつかのガイドラインでは、1画面におさまらなくなったら、とあるし[1]、
それ以外にも再利用するかどうかを基本に、二度以上繰り返す処理であれば関数にすべきであり、
そうでなければそのままインラインにしておく、というのもある。
それ以外にも再利用するかどうかを基本に、二度以上繰り返す処理であれば関数にすべきであり、
そうでなければそのままインラインにしておく、というのもある。
2017/01/30(月) 23:35:08.45
しかし私にとってもっとも理にかなっていると思われたのは、意図と実装の分離というものだ。
もしも、なにをしているのか理解するのに努力しなければならないコードの一部分があったとしたら、
そこを関数として切り出し、“what”に続いてその名前を付けてしまうのである。
もしも、なにをしているのか理解するのに努力しなければならないコードの一部分があったとしたら、
そこを関数として切り出し、“what”に続いてその名前を付けてしまうのである。
2017/01/30(月) 23:35:31.30
こうすれば、もう一度そのコードを読んだときに、そのコードの目的はすぐさま
目に飛び込んでくるだろうし、その関数がやろうとしていること、
すなわち関数本体に注意を払う必要はなくなるだろう。
私はこの規律を採用してから短い関数を書くようなった、典型的には数行だ[2]。
コードが6行を超えると、もう私にとっては関数の匂いを感じ始めるし、
1行のコードからなる関数でさえ珍しくない[3]。
目に飛び込んでくるだろうし、その関数がやろうとしていること、
すなわち関数本体に注意を払う必要はなくなるだろう。
私はこの規律を採用してから短い関数を書くようなった、典型的には数行だ[2]。
コードが6行を超えると、もう私にとっては関数の匂いを感じ始めるし、
1行のコードからなる関数でさえ珍しくない[3]。
2017/01/30(月) 23:36:10.28
実のところコードのサイズが重要なのではない、という考えは、
ケント・ベックがオリジナルのSmalltalkシステムにおける実例に
よって示してくれたものだった。当時のSmalltalkはモノクロディスプレイで
動作していたので、テキストやグラフィックをハイライト表示したいときには、
画像を反転させることで実現する。そしてSmalltalkの画像のクラスには
この“Highlight”(ハイライト)と呼ばれるメソッドがあり、
この実装は単に“reverse”メソッドを呼び出すものだったのだ[4]。
この名称は実装よりも長いのたが、コードの意図とコードの
実装のあいだには大きな距離があったから、そのことは大きな問題にならなかった。
ケント・ベックがオリジナルのSmalltalkシステムにおける実例に
よって示してくれたものだった。当時のSmalltalkはモノクロディスプレイで
動作していたので、テキストやグラフィックをハイライト表示したいときには、
画像を反転させることで実現する。そしてSmalltalkの画像のクラスには
この“Highlight”(ハイライト)と呼ばれるメソッドがあり、
この実装は単に“reverse”メソッドを呼び出すものだったのだ[4]。
この名称は実装よりも長いのたが、コードの意図とコードの
実装のあいだには大きな距離があったから、そのことは大きな問題にならなかった。
2017/01/30(月) 23:36:44.15
このように小さな関数は名前が良い場合にのみ機能するので、
名前付けには注意を払う必要がある。 これには練習が必要だけれど、
ひとたび上達したならばこの方法でコードを高度に自己文書化できる。
より大きいスケールで見れば、関数は物語のように読むことができ、
読むものにとって必要なときにどの関数を詳しく読み込んでいくか選択できるようになるのだ。
名前付けには注意を払う必要がある。 これには練習が必要だけれど、
ひとたび上達したならばこの方法でコードを高度に自己文書化できる。
より大きいスケールで見れば、関数は物語のように読むことができ、
読むものにとって必要なときにどの関数を詳しく読み込んでいくか選択できるようになるのだ。
2017/01/31(火) 19:54:01.09
良いこと書いてるのに伸びないんだな
ちょっと抽象的すぎるのかな
ちょっと抽象的すぎるのかな
2017/01/31(火) 20:44:01.22
何で料理バンザイみたいなスレタイ?
9仕様書無しさん
2017/01/31(火) 21:50:05.13 マジレスするとプログラマとしては実績のないコンサル野郎が言ったことを真に受けるほどプログラマはバカじゃない
6行とか非現実的、現場では100行の関数を即座に読み解く能力がないと戦力にならない
理想を描いて夢物語を語ってるだけの無能コンサルなんて誰も相手にしない
6行とか非現実的、現場では100行の関数を即座に読み解く能力がないと戦力にならない
理想を描いて夢物語を語ってるだけの無能コンサルなんて誰も相手にしない
10仕様書無しさん
2017/01/31(火) 22:32:51.47 Smalltalk をよくしらないとぴんときにくい話かと
11仕様書無しさん
2017/02/01(水) 05:42:36.0312仕様書無しさん
2017/02/01(水) 05:43:02.65 あと、マーチン・ファウラーはコンサルではない。
お前なんか足元にも及ばない優秀な技術者だからね
お前なんか足元にも及ばない優秀な技術者だからね
13仕様書無しさん
2017/02/01(水) 09:08:48.09 ほんとかよと思って Pharo Smalltalk http://pharo.org/
で調べてみたら 9万個のメソッドが 56万行で書かれていて確かに平均 6行程度だった
| linesOfCodes |
linesOfCodes := CompiledMethod allInstances collect: #linesOfCode.
^{#count->linesOfCodes size. #total->linesOfCodes sum. #average->linesOfCodes average asFloat}
"=> {#count->93474. #total->562876. #average->6.021738665297302} "
で調べてみたら 9万個のメソッドが 56万行で書かれていて確かに平均 6行程度だった
| linesOfCodes |
linesOfCodes := CompiledMethod allInstances collect: #linesOfCode.
^{#count->linesOfCodes size. #total->linesOfCodes sum. #average->linesOfCodes average asFloat}
"=> {#count->93474. #total->562876. #average->6.021738665297302} "
14仕様書無しさん
2017/02/01(水) 09:42:37.06 平均6行はトップクラスの技術者だろうけど
まあ平均10行ぐらいかな、これを普通だろと思う人と
ありえないと思う人で、プログラマと非プログラマに別れると思うわ
もちろん平均10行が普通っていうのは、
頑張ればできるけどさぁ、でもそうすると逆にわかりづらくなるしぃ
みたいな事を言ってる人は含めない。
平均10行を普通に書いてますっていう意味
もちろん俺も平均10行なら普通だな。
普通に書けば自然とそうなる。どうしようもないw
まあ平均10行ぐらいかな、これを普通だろと思う人と
ありえないと思う人で、プログラマと非プログラマに別れると思うわ
もちろん平均10行が普通っていうのは、
頑張ればできるけどさぁ、でもそうすると逆にわかりづらくなるしぃ
みたいな事を言ってる人は含めない。
平均10行を普通に書いてますっていう意味
もちろん俺も平均10行なら普通だな。
普通に書けば自然とそうなる。どうしようもないw
15仕様書無しさん
2017/02/01(水) 11:03:51.90 >>13 の内訳も調べてみた。
| roundedLinesOfCodes |
roundedLinesOfCodes := ((CompiledMethod allInstances collect: #linesOfCode) roundTo: 10) asBag.
^roundedLinesOfCodes size -> roundedLinesOfCodes sortedCounts
"=> 93468→{56695→0. 29798→10. 4712→20. 1257→30. 474→40.
218→50. 125→60. 53→70. 49→80. 18→90. 12→100. 11→110.
10→140. 6→120. 5→130. 4→150. 4→180. 3→200. 2→210. 2→300.
1→160. 1→170. 1→190. 1→230. 1→290. 1→400. 1→410. 1→510. 1→1300. 1→1700} "
6割くらいのメソッドが 4行以下、
3割くらいが 5行〜14行程度、
以降、20行程度、30行程度、40行程度、50行程度、…と減っていく
ちなみに 1000行を超えるメソッド 2つは、いずれもコンスタントメソッドだった
CompiledMethod allInstances select: [:meth | meth linesOfCode > 1000] thenCollect: #selector
"=> #(#iso3166Codes #tigerPoints) "
| roundedLinesOfCodes |
roundedLinesOfCodes := ((CompiledMethod allInstances collect: #linesOfCode) roundTo: 10) asBag.
^roundedLinesOfCodes size -> roundedLinesOfCodes sortedCounts
"=> 93468→{56695→0. 29798→10. 4712→20. 1257→30. 474→40.
218→50. 125→60. 53→70. 49→80. 18→90. 12→100. 11→110.
10→140. 6→120. 5→130. 4→150. 4→180. 3→200. 2→210. 2→300.
1→160. 1→170. 1→190. 1→230. 1→290. 1→400. 1→410. 1→510. 1→1300. 1→1700} "
6割くらいのメソッドが 4行以下、
3割くらいが 5行〜14行程度、
以降、20行程度、30行程度、40行程度、50行程度、…と減っていく
ちなみに 1000行を超えるメソッド 2つは、いずれもコンスタントメソッドだった
CompiledMethod allInstances select: [:meth | meth linesOfCode > 1000] thenCollect: #selector
"=> #(#iso3166Codes #tigerPoints) "
16仕様書無しさん
2017/02/01(水) 13:50:16.23 まあ、何でも過ぎたるは及ばざるでバランスだよね
17仕様書無しさん
2017/02/01(水) 19:43:18.10 Smalltalkって、Smalltalkの環境そのものや遊びを除けば
どういう実案件で使われるの?
どういう実案件で使われるの?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市内閣の若い世代の支持率は92.4% FNN世論調査★2 [♪♪♪★]
- 【サッカー】日本代表の南野拓実は左膝前十字靱帯断裂の重傷 全治は明らかにされず フランス杯で負傷 所属先のモナコが発表 [久太郎★]
- H3ロケット8号機打ち上げ失敗、衛星軌道投入できず ★7 [少考さん★]
- 【兵庫】「女性を妊娠させる権利と30万ドル渡す」にだまされ暗号資産50万円相当詐欺被害 西宮市の男性会社員(50) [ぐれ★]
- 【MLB】村上宗隆の『小型契約』は吉田正尚の影響か 市場が思いのほか停滞 「NPB打者に懐疑的。吉田が高すぎた」 [冬月記者★]
- ゼレンスキー氏「高市総理に感謝」 9000億円超追加支援に 「国際秩序に貢献」 (動画あり) [ごまカンパチ★]
- 駅弁業界ヤバイ「な・ん・で・買ってくれないのぉおおおおおお!」 [592058334]
- 🏡
- 【高市悲報】超有名YouTuber、「米山隆一が逮捕される」というデマ動画が20万回再生、無事訴えられる🥹 [931948549]
- 生還者語る。サウナ脱出必勝法、やっぱこれだった [728791131]
- 嫌儲の核保有反対派ってなんであんなに馬鹿みたいなやつしかいないの? [848333321]
- 茶ぁしばこうやぁ···( ¨̮ )︎︎𖠚ᐝ13
