プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • リファクタリング
  • 【オブジェクト指向】ベストプラクティス(デメテルの法則なども)
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【オブジェクト指向】ベストプラクティス(デメテルの法則なども)

08.17

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

手続き型じゃなく、オブジェクト指向っぽく書くためには。

ただ、全て守ればいいというわけではなくこれに近づけるとオブジェクト指向っぽくなるので実際に使う際はある程度緩めても良いかもしれない。

クラス設計

継承を使うのであればできるだけ「抽象クラス」を使う

クラスの用途をできるだけ限定するため。クラス名の先頭に「Abstract〜」などと付けてこれは継承することが前提のものですよということを他の開発者に伝えるようにすると良いでしょう。

クラス内部実装で心掛けた方が良いこと

メソッドないのインデントは1段まで

例えば、for文の中にif文を書いたりすることもできない。

そうすることで1つのメソッドの持つ役割を小さくすることができる。

elseは禁止

早期リターン(ガード節)などをしても良い。

1
2
if (isXXX) return calcXXX
if (isYYY) return calcYYY

プリミティブ型(int、boolean)と文字列型(string)はラップする。

以下のようにしてはダメ

1
2
private int age
private string name

別途クラスを作った上でこうする。

1
2
private Age age
private Name name

なぜかと言えば、Ageクラス側でマイナスの値を受け付けないなどの処理を書くなどをする。(普通に考えて年齢にマイナスはあり得ないので、普通にプリミティブな型を使うよりもageらしい型を作ることができる。)

これをいわゆる「値オブジェクト(valueオブジェクト)」と呼びます。

1クラスは50行まで、1ディレクトリ(パッケージ)10ファイルまで

1クラスにつきインスタンス変数は2つまで

例えば、userクラスには10個くらいインスタンス変数があったとしても無理にでも意味づけして別クラスにして抽象化すること。そうするとオブジェクト指向っぽく書ける。

ファーストクラスコレクションを使用する。

配列や、コレクションなどをそのまま使うのではなくクラスでラップすること。

getter、setter、publicプロパティ禁止

publicプロパティ

勝手に外から書き換えられてしまうことになってしまう。必ずprivateプロパティにしましょう。

getter、setter

せっかくprivateにしてもこれで直接書き換えられてしまったら意味がないです。getter、setterは不要であることが望ましいです。

では、そのオブジェクトのメンバーの値が知りたい場合は知りたい用途などがあると思うので、isXXXなどのメソッドを作るなどしてオブジェクト側で制御構文を記述するような作りにしましょう。

なぜこうするかというと、以下の理由があるため。

  • 原則データは隠すもののため。
  • 値の変更に強くなるため。(クラスの外側で値を参照させてしまうとクラスの外側で具体的に値を参照することになるので色んな箇所を修正する必要が出てきてしまう。)

デメテルの法則を守る。

オブジェクト指向のメソッド呼び出しに秩序をもたらすガイドラインです。

メソッドを呼び出すオブジェクトは次の4つに限定されます。

オブジェクト自身
引数として渡されたオブジェクト
インスタンス変数
直接インスタンス 化したオブジェクト
例えば

「親クラス.子クラス.子クラスのメソッド」みたいな形でメソッドを呼び出すのはNGということですね。

守らないことによるデメリット
密結合になる。

例えば、子クラスでメソッドやプロパティを削除したときに親クラスまで参照して直さないといけなくなってしまう。

テストがしづらくなる。
対策
Railsでは

delegateを使ってメンバーを呼び出すという方法もあるみたいです。(厳密には対策になってないかもしれない)

スポンサーリンク
  • 2021 08.17
  • miyabisan2
  • コメントを書く
  • オブジェクト指向, リファクタリング
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2021 08.01

    【リファクタリング】変更な大変なプログラムと改善策、「区分」や「タイプ」の実装方法

  2. 2021 08.28

    【オブジェクト指向】「オープン・クローズドの原則」とは

  3. 2019 12.12

    【リファクタリング】「命名規則」の考え方(定数など)

  4. 2018 03.25

    【Javaリファクタリング】綺麗なコメントの書き方

  5. 2018 05.13

    【GoFのデザインパターン】「Proxy(プロキシ)」ってどんなパターン?

  6. 2018 05.13

    【GoFのデザインパターン】「Facade(ファザード)」ってどんなパターン?、設計方針なども。

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【JavaScript】「TypeScript」でES…

【リファクタリング】共通処理の良い書き方(Common…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー