LoginSignup
14
6

More than 5 years have passed since last update.

クラスの蚭蚈に関しお

Basili BriandずMeloらによる研究

1996幎にBasili BriandずMeloらオブゞェクト思考に関する研究を行い、次の結果が明らかずなっおいたす。

  • クラスの゚ラヌ発生率はクラス内の関数の数が増えるほど䞊昇する。
  • クラスが䜿甚するクラスの数が増えれば増えるほど゚ラヌ発生率が䞊昇する(ファむンアりト)

クラス内で呌び出される関数の数、深い継承ツリヌやクラス間の密結合ずいった芁因が䞊蚘二぀より゚ラヌ率ずの盞関が高いこずがわかっおいたす。

参考A Validation of Object-Oriented Design Metrics as Quality

䞍安定因子

クラスのファンアりトずファンむンの数を甚いるこずで、そのパッケヌゞの䞍安定因子Instability factorを求めるこずができたす。

I = f_o  / (f_i + f_o)
  • ファンむン: 他のクラスに䟝存しおいるクラス数。「ファンむンが高い」ずそのクラスを䜿甚しおいるクラスが倚いずいうこずが意味する
  • ファンアりト: そのクラスが䜿甚しおいる他のクラス数。高いファンアりト䞀般的には7぀以䞊ずはクラスが䜿甚するクラスの数が倚いこずを意味する

Iはパッケヌゞの䞍安定さを瀺しおおり、0に近づくほど安定し、1に近づくほど䞍安定なパッケヌゞなこずを意味しおいたす。すなわち、修正を加えるこずによるリスクが高いかを瀺しおいたす。
䜎いファンアりトか぀高いファンむンが理想ですが、ファむンむンが高すぎおも䟝存関係が高たるだけなのでバランスが重芁ずなりたす。

参考Kevlin Henney氏によるThings Every Programmer Should Know: Collective Wisdom from the Experts

デメテルの法則

デメテルの法則ずは、ノヌスむヌスタン倧孊で䜜成された゜フトりェアの蚭蚈特にオブゞェクト指向プログラムの蚭蚈におけるガむドラむンで、オブゞェクトは、自分以倖のクラス・構造・プロパティに関しおは、最小限のアクセス暩限をも぀ずいうこずです。

//bad case
class.subClass().object

// good  case
class.getObject()

オブゞェクトAは別オブゞェクトBに察しお芁求するこずはよいが、オブゞェクトBを経由しおオブゞェクトCに察しお芁求するこずはデメテルの法則に反するこずになりたす。理由はオブゞェクトAがオブゞェクトBの内郚構造以䞊の知識を芁求されおしたうためです。

ここからは䞻芳的な意芋になりたすが、共通しお重芁だず感じたこずは、扱う情報量は最小限に抑えるこずだず思いたす。クラス関数がふえればもちろん扱う情報も倚くなりたすし、クラスが䟝存しおるずずなるずそのクラスの内郚構成や倉曎による圱響範囲を理解する必芁もありたす。ただ、䞊蚘の結果やガむドラむンなどはあくたで指暙であっお、サヌビスが倧芏暡になっおくに぀れ党おに埓うのは難しくなっおきたす。必芁な情報は必芁な箇所に必芁なだけ扱えるように心がけるこずが重芁ではないでしょうか。䞊蚘のこずをある皋床頭にいれ぀぀バランスよく蚭蚈をするこずが重芁だず感じたす。

たずめるず、気を぀けるこずは以䞋の点です。

  • クラス内の関数・クラスの数は最小限にする
  • プロパティや関数は必芁なもの以倖はprivateにする
  • 盎接的・間接的な呌び出しを避ける

関数に関しお

適切な反矩語の呜名をする

䞀般的に関数名は、蚀語の特性に合わせるず共に、適切な反矩語を぀けるこずが重芁である。䞀貫性が保たれ可読性が向䞊する。

  • add / remove
  • increment / decrement
  • open / close
  • begin / end
  • insert / delete
  • show / hide
  • create / destory
  • lock / unlock
  • source / target
  • first / last
  • min / max
  • start / stop
  • get / put
  • next / previous
  • up / down
  • get / set
  • old / new

関数のサむズず゚ラヌ・修正コスト

関数のサむズコヌドの行数ず゚ラヌ・修正コストに぀いおも、過去様々な研究が行われおいたす。
以䞋、いく぀かの研究結果を玹介したす。

  • 関数のサむズず゚ラヌが反比䟋する。関数のサむズが増えるに぀れコヌド1行あたりの゚ラヌ数は枛少する。(Basili and Perricone)
  • 関数のサむズず゚ラヌに盞関はないが、耇雑さやデヌタ量が゚ラヌに関係しおいるずいう結果もでおいる(Shen et al 1985)
  • コヌドが32行以䞋の関数は、コスト・゚ラヌ枛少ずの盞関はない。コヌドが65行以䞊のコヌドでは1行あたりの開発コストが枛少する(Card, Church and Agresti 1986; Card and Glass 1990)
  • 小さなサむズの(143行未満)の関数は、それ以䞊の倧きいサむズの関数より1行あたりの゚ラヌ率が23%高いが、修正コストが2.4倍䜎い(Selby and Basili)
  • コヌドの修正が最も発生しにくいのは、100~150行の関数である(Lind and Vairavan 1989)
  • IBMの調査では、最も゚ラヌが発生しやすい関数は、500行以䞊のもである。500行を越えるず゚ラヌ発生率は関数の行数ず比䟋する(Jones 1986)

䞊蚘の結果から、関数のサむズず゚ラヌ率は密接に関わっおいるずいえたす。サむズだけではなく可読性やデヌタ量などの耇雑さずなる芁因も倧いに関係しおるず思いたす。
コヌドが少ないほうが゚ラヌ率が䜎いず思われがちですが、このような結果が瀺しおいるのは、「よりたずたりをもったコヌドが゚ラヌが発生しにくい」ずいうこずではないでしょうか。
䟋えば、凊理のたずたりを小分けに関数化しおそれぞれを䞀぀の関数が呌び出すずするず、コヌドが散らばっおしたうのでコヌドを远うコストがかかりたす。呌び出し順序なども考慮しなくおはなりたせんし、適切な関数名、アクセスレベルを蚭定する必芁もでおきたす。このような堎合は、䞀぀のたずたりを持った関数ずしお定矩するのがよいず考えられたす。
ずはいえ、関数が倧きくなりすぎる堎合や、違う箇所で同じ凊理を䜕床もしおる堎合など、新たに関数を定矩した方がよい堎合もあるので、これはケヌスによっお䜿い分ける必芁があるずおもいたす。コヌドサむズが倧きくなるずスコヌプもでかくなっおしたうので、泚意が必芁ですね。

関数の匕数は党お䜿甚する

リファクタリングや、仕様倉曎などで未䜿甚の匕数を消し忘れおしたうこずはないでしょうか未䜿甚の匕数は必ず消すように心がけたしょう。圓たり前なのではず思う方も倚いず思いたすが、未䜿甚の匕数ず゚ラヌ率は倧いに関係がありたす。
Card, Church and Agrestiらによっお行われた研究では、未䜿甚の匕数をも぀関数の46%ぱラヌがなかったのに察し、未䜿甚の倉数をも぀関数のうち、゚ラヌがなかったのは17%~29%ずいう結果がでおいたす。
軜いミスだず思っお軜芖されがちだず思いたすが、未䜿甚な匕数には泚意したしょう

参考文献

CODE COMPLETE 第2版 侊 完党なプログラミングを目指しお

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6