Single Responsibility Principle in GO


☝ Single Responsibility
"In any well-designed system, objects should only have a single responsibility."by Robert Martine.
すべての設計が良好なシステムでは、オブジェクトには1つの責任しかありません.
すなわち、実装オブジェクトのコードは、効率的な方法で1つのことを処理することに集中しなければならない.この言葉を正しく理解するためには、これらの原則に違反するコードを表示したほうがいいです.
まず、ドローンベースの配布サービスをサポートするソフトウェアを開発しているとします.
次のコードは、Droneが納品中に負うべき責任を定義するコードと見なすことができます.
// NavigateTo applies any required changes to the drone's speed 
// vector so that its eventual position matches dst.
func (d *Drone) NavigateTo(dst Vec3) error { //... }

// Position returns the current drone position vector.
func (d *Drone) Position() Vec3 { //... }

// Position returns the current drone speed vector.
func (d *Drone) Speed() Vec3 { //... }

// DetectTargets captures an image of the drone's field of view (FoV) using
// the on-board camera and feeds it to a pre-trained SSD MobileNet V1 neural
// network to detect and classify interesting nearby targets. For more info
// on this model see: 
// https://github.com/tensorflow/models/tree/master/research/object_detection
func (d *Drone) DetectTargets() ([]*Target, error) { //... }
上記のコードは単一責任の原則に違反しています.
その原因は二つの複合の責任を同時に負っていると言える.
  • ナビ(飛行)
  • 検出
  • 実際には、飛行とプローブの2つの責任を「ドライブ」と呼ばれるオブジェクトタイプに同時に宣言して開発しても、最初のプログラム操作は問題ない可能性があります.しかし、問題はその後に起きた.飛行と探査の2つの責任が同時に存在するため,結合が生じ,さらなる開発と拡張の難しさが増す.
    たとえば、プローブ用の人工知能モデルを他のものとして使用したり、他のタイプのドライブで既存の同じプローブコードを使用したりする場合は、存在する結合状態を維持しなければなりません.そのため、飛行に関連するコードを常に維持する必要があります.