データの塊

オブジェクト指向プログラミングの概念

オブジェクト指向プログラミングにおいてデータクランプとは、プログラムの様々な部分で一緒に(塊として)渡される変数のグループを指します。データクランプは、他のコードスメルと同様に、プログラムの設計や実装におけるより深刻な問題を示している可能性があります。通常、データクランプを構成する変数のグループは密接に関連しているか相互に依存しており、結果としてグループとして一緒に使用されることがよくあります。データクランプは、クラスレベルのコードスメルの一種としても知られており、ソースコードの記述が不十分な場合に現れる症状である可能性があります

データ塊のリファクタリング

一般的に、データクランプはリファクタリングする必要があります。データクランプの存在は、通常、ソフトウェア設計が不十分であることを示しています。なぜなら、異なる変数を単一のオブジェクトに正式にグループ化し、多数のプリミティブではなく、このオブジェクトのみを渡す方が適切だからです。データクランプをオブジェクトに置き換えることで、全体的なコードサイズを削減できるだけでなく、プログラムコードの整理、可読性、デバッグ性が向上します。

データの塊を取り除くプロセスは、異なる種類のコードの臭い(データクラス、つまりデータを格納するだけで、実際にデータを操作するメソッドを持たないクラス)を生み出すリスクを伴います。しかし、クラスを作成することで、プログラマーはここにも含められる可能性のある機能に気付くようになります。[1] [2]

オブジェクト指向プログラミングにおいて、オブジェクトの目的は、関連するデータ(フィールド)と、そのデータに対して実行できる操作(メソッド)の両方をカプセル化することです。 [3]フィールドを真のオブジェクトにグループ化できないと、関連するアクションの関連付けが阻害される可能性があります。

パラメータ/変数の長いリストは、必ずしもデータの塊を意味するわけではありません。これらの値が密接に論理的に関連している場合にのみ、それらの存在がデータの塊とみなされます。このようなケースは稀ですが、メソッドが6個以上の全く関連のないパラメータを正当に受け取り、それらを単一のオブジェクトにきれいに変換できない場合があります。しかし、これはメソッドがあまりにも多くの処理をしようとしていることを示唆しており、複数のメソッドに分割し、それぞれのメソッドが全体の責任の一部を担う方が適切です。これは、コードの品質を向上させるためのリファクタリングの機会を示唆しています。

データの塊を取り除くためのリファクタリングは、手作業で行う必要はありません。多くの最新のフル機能IDEには、このリファクタリングを自動またはほぼ自動で実行できる機能(多くの場合「クラスの抽出」と呼ばれます)が搭載されています。これにより、リファクタリングのコストが削減され、信頼性が向上するため、これまでリファクタリングに消極的だった開発者でも、迅速にリファクタリングを行うことができます。

当然のことながら、データクランプはあらゆるオブジェクト指向プログラミング言語に存在します。以下の例は、スコープと構文が単純であるという理由だけで選ばれました。

C#

リファクタリング前:

パブリックvoid AddCoords ( int x , int y , int z ) { // ... }       

    

リファクタリング後:

public void AddCoords ( Coords coords ) { // ... }   

    


パブリッククラスCoords { public Coords ( int x , int y , int z ) { this . X = x ; this . Y = y ; this . Z = z ; }  

          
    
          
          
          
    

    パブリックint X {取得; }パブリックint Y {取得; }パブリックint Z {取得; } }     
         
         

ジャワ

パッケージorg.wikipedia.examples ; 

public class Example { public static void welcomeNew ( String firstName , String lastName , int age , String gender , String occupation , String city ) { System . out . printf ( "ようこそ %s %s、%d 歳の %s さん、%s として働いています。%n" , firstName , lastName , age , gender , city , occupation ); }   
                   
              
    

    public static void main ( String args [] ) { String firstName = args [ 0 ] ; String lastName = args [ 1 ] ; int age = Integer.parseInt ( args [ 2 ] ) ; String gender = args [ 3 ] ; String occupation = args [ 4 ] ; String city = args [ 5 ] ; welcomeNew ( firstName , lastName , age , gender , occupation , city ) ; } }     
           
           
           
           
           
           
             
    

前の例では、すべての変数を単一の「Person」オブジェクトにカプセル化し、それ自体で渡すことができます。さらに、プログラマーはwelcomeNewメソッドをクラスに関連付けた方が適切だと判断してPerson、 に関連する他の適切なアクションを考案できるかもしれませんPerson。例えば、このコードは次のようにリファクタリングして拡張できます。

パッケージorg.wikipedia.examples ; 

public class Example { public record Person ( String firstName , String lastName , int age , String gender , String occupation , String city ) { // レコードにはカスタム メソッドを追加できるので、 welcomeNew() メソッドと work() メソッドを含めましょう。public void welcomeNew () { System . out . printf ( "ようこそ %s %s、%d 歳の %s さん、%s として働いている %n" firstName lastName age gender city occupation ); }   
                  
        
        
           
                  
        

        public void work () { System . out . printf ( "これは %s です。%s で %s に取り組んでいます。%n" , firstName , occupation , city ); } }   
               
        
    

    public static void main ( String args [ ] ) { String firstName = args [ 0 ] ; String lastName = args [ 1 ] ; int age = Integer.parseInt ( args [ 2 ] ) ; String gender = args [ 3 ] ; String occupation = args [ 4 ] ; String city = args [ 5 ] ;     
           
           
           
           
           
           

        Person joe = new Person ( firstName , lastName , age , gender , occupation , city ); joe . welcomeNew (); joe . work (); } }         
        
        
    

これによりコードの長さは増加しましたが、単一のPersonを、複数の(一見無関係な)フィールドではなく、単一のオブジェクトとして簡単に渡すことができるようになりました。さらに、これにより、関連メソッドをクラス内に移動して、個々のインスタンスに対して簡単に操作できるようになります。これらのメソッドは、オブジェクトインスタンス自体のインスタンス変数として保存されるため、面倒なパラメータリストを渡す必要がなくなりました。 [4]

参考文献

  1. ^ Fowler, Martin. 「DataClump」 . 2017年2月10日閲覧
  2. ^ 「Data Clumps」. SourceMaking . 2017年2月10日閲覧
  3. ^ Kindler, E.; Krivy, I. (2011). 「洗練された制御を備えたシステムのオブジェクト指向シミュレーション」International Journal of General Systems : 313– 343.
  4. ^ 「クラス変数とインスタンス変数の違いは何ですか? - プログラマーとソフトウェアの面接の質問と回答」。プログラマーとソフトウェアの面接の質問と回答。 2017年2月20日閲覧
「https://en.wikipedia.org/w/index.php?title=Data_clump&oldid=1332334097」から取得