Skip to content

DNET_DRY

nishi_74322014 edited this page Sep 11, 2026 · 1 revision

Dry(Don't repeat yourself)

概要

定義を忘れるためメモ。

対象

様々な参考情報を参考にすると、恐らく、
前者(コードを対象としているという主張)が正しい。

コードを対象としているという主張

単に「コードを重複させない」という原則ではなく、

  • DBスキーマ、
  • テスト、
  • ビルドシステム、
  • ドキュメント

なども対象になっており、

「ソフトウェア開発全体において情報を重複させない」

という原則。

コードを対象としていないという主張

OAOO原則

転じて、プログラムコード中で同じ(ような)動作をするコードを何度も書かずに、
一度書いたものを再利用するようにすべきとする意味で用いられることもあるが、
こちらは本来は OAOO(Once And Only Once) 原則と呼ばれるものである。

クラス、オブジェクトに対する適用

  • DRY はオブジェクト・インスタンス(データ)に対して適用されるのに対して、
  • OAOO はクラス(コード)に対して適用される。

用例

2つのコンテキストがある。

  • 業務系などライフサイクルが長いケースでは前者が重視されていると思う。
  • Web、ゲームなどライフサイクルが短いケースでは後者が重視されていると思う。

ポジティブなコンテキスト。

共通化などを行ったDry。

  • 大規模なSI案件では、
    チーム開発でも疎結合なDryの状態を維持するため、
    標準化・共通化などは半ば常識的に行われる。

    密結合なDryの状態で開発されていたら、大規模化して
    長期の維持・保守が必要になった場合に、対応できなくなる。

  • Open棟梁導入案件でも、案件毎に、更に追加のレイヤが追加されるので、
    標準化・共通化のレイヤは、追加されたUIコントロールなどで、かなり分厚くなる。

ネガティブなコンテキスト。

(車輪の再開発はしない的な)素描Dry。

  • 観測範囲で、Web、ゲームやフリーランス界隈でも、Dryが尊ばれている様に見える。

  • しかし、下記のように、「Dryで書いたものが負債になっていく。」という発言もあり、
    ライフサイクルが短く、スクラップ・アンド・ビルドなプロジェクトでは、デメリットを理解する必要がある。

    • ≒ モジュール強度が強く、結合度が弱くなる境界で分割されていない。

    • ≒ デファクトなフレームワークの生のAPIを触りたい為、レイヤ分割を避けている。

      • フレームワークの生のAPIを触りたい。
      • 低品質な≒オレオレ的なレイヤを構築したくない(&触りたくない)。

※ なんとなく、時間を掛けて適切な設計が出来無い案件でDryが問題になっているように見える。

疑問

モジュールの凝集度・結合度との関連

ありそう。

  • モジュールとしてまとめられたときに困るのは、
    凝集度が低く、結合度が高くて、自由度が制限されること。

  • モジュール化するべきか、しないべきか、については慎重に考えたい。

スタックしなくてもDryにできるか?

基本スタックしないとダメそう(素描DryはDryじゃないダロ的な)。

参考

デメリットについての言及

正誤

  • 「こちらは本来は“OAOO(Once And Only Once)原則と呼ばれるものである。」の 閉じられていない開き二重引用符(“)は、対応する閉じ引用符が無く誤記と判断して除去した。

移行メモ

  • 元 Wiki では見出しそのものが他ページへのリンクになっていた箇所 (「OAOO原則」)は、GitHub Wiki では見出しからアンカが生成されるため、 見出しをプレーン・テキストとし、リンクは直下の本文に置いた。
  • PukiWiki のページ内アンカ(#xxxxxxxx)は GitHub Wiki では再現できないため、 同一ページ内のアンカは見出しから生成されるアンカに張り替えた。
  • Open 棟梁 Wiki(opentouryo.osscons.jp)へのリンクは、 当該サイトが未移行のため URL のままとした。

Tags: 移行, DRY, Don't repeat yourself, OAOO, 原則, 共通化, 凝集度, 結合度

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally