Yanonoblog!

こつこつと

目的駆動名前設計

はじめに

本記事では「良いコード 悪いコードで学ぶ設計入門」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしています。

書籍ではJavaで説明されていたのですが本記事ではRubyに置き換えながら解説しています。

目的駆動名前設計

目的駆動名前設計(PDD:Purpose-Driven Design)は、ソフトウェア開発における名前付けの原則です。

PDDでは、コードやアーキテクチャの要素にわかりやすく適切な名前を付けることを重視することで、可読性や保守性を向上させます。

名前設計が不十分なケース

名前設計の不十分なケースとして、ECサイトでの商品を取り上げてみましょう。

良くないケースとしてあるのは、商品を単純に「商品クラス」と命名してし商品に関するクラスを総まとめにしてしまうことです。

# 商品に関するロジックを全てをProductクラスで全て担う

class Product
  attr_accessor :name, :price

  def initialize(name, price)
    @name = name
    @price = price
  end
end

ECサイトは商品を中心に成り立っています。出品、予約、注文、発送など、商品を取り扱うユースケースがたくさんあります。

「商品クラス」という名前では、商品の目的や機能が十分に伝わらず、どのような操作や情報が関連しているのかが明確になりません。

商品クラス自体も、結び付いたクラスに関係するロジックを持ちはじめ、どんどん巨大化複雑化することで、他のクラスやメソッドとの区別もつきにくくなります。

関心の分離

関心の分離(Separation of Concerns)は、ソフトウェア開発の原則の一つです。

この原則では、異なる関心事を明確に分けることを促します。

関心事とは、プログラム内で扱う要素や機能のことであり、それぞれの関心事は異なる目的や責任を持ちます。

商品クラスを分ける例

商品クラスを Product、注文品クラスを OrderItem、発送品クラスを ShipmentItem、予約品クラスを ReservationItem、出品クラスを ListingItem として命名してクラスを分けています。

それぞれのクラスは、異なる関心事を持ち、商品や注文品の管理を行います。

# 商品クラス
class Product
  attr_accessor :name, :price

  def initialize(name, price)
    @name = name
    @price = price
  end
end

# 注文品クラス
class OrderItem
  attr_accessor :product, :quantity

  def initialize(product, quantity)
    @product = product
    @quantity = quantity
  end
end

# 発送品クラス
class ShipmentItem
  attr_accessor :product, :quantity

  def initialize(product, quantity)
    @product = product
    @quantity = quantity
  end
end

# 予約品クラス
class ReservationItem
  attr_accessor :product, :quantity

  def initialize(product, quantity)
    @product = product
    @quantity = quantity
  end
end

# 出品クラス
class ListingItem
  attr_accessor :product, :quantity

  def initialize(product, quantity)
    @product = product
    @quantity = quantity
  end
end

これにより、それぞれのクラスが独立して存在し、名前の衝突を避けることができます。

各クラスは必要に応じてメソッドや属性を追加することで、それぞれの役割を果たすことができます。

命名が出来たら分離したクラスそれぞれに、各関心事にふさわしいロジック(注文品クラスならば、商品注文に関するロジック)を内部にカプセル化します。

関心の分離により疎結合高凝集が果たされます。

命名の重要性は、可読性や保守性を高めるために欠かせません。適切な命名により、コードの意図が明確になり、コードベース全体の理解やメンテナンスが容易になります。

参考

続く…

コメント

本記事の内容は以上になります!

書籍の続きのアウトプットも随時更新したいと思います。


プログラミングスクールのご紹介 (卒業生より)

お世話になったプログラミングスクールであるRUNTEQです♪

https://runteq.jp/r/ohtFwbjW

こちらのリンクを経由すると1万円引きになります。

RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。

もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。

https://twitter.com/outputky