23

私はこれをうまくやる方法を見たことがありません。他の人がどのようにやっているか見てみたいです。現在、私は次のようにフォーマットしています:

public Booking createVehicleBooking(Long officeId, 
                                    Long start, 
                                    Long end,
                                    String origin, 
                                    String destination, 
                                    String purpose,         
                                    String requirements, 
                                    Integer numberOfPassengers) throws ServiceException {
/*..Code..*/
}
4

6 に答える 6

16

このようなパラメーターの大きなセットは、多くの場合 (常にではありません)、パラメーター セットを表すためにオブジェクトを使用できることを示しています。これは、次のいずれかの場合に特に当てはまります。

  • 同様の大規模なパラメーター セットを持つメソッドがいくつかありますが、これらはパラメーター オブジェクトを受け取る単一のメソッドに置き換えることができます。

  • メソッドが呼び出されますcreate...

したがって、上記のコードは次のようになります (私の C++ を許してください。私は Java 開発者です)。

class BuildVehicleBooking {
    Long officeId;
    Long start;
    Long end;
    String origin;
    String destination;
    String purpose;             
    String requirements;
    Integer numberOfPassengers;

    Booking createVehicleBooking () throws ServiceException { ... }
}

これがビルダーパターンです。このパターンの利点は、パラメーターが互いにどのように関連するかについての複数のバリエーションを含め、パラメーターの複雑なセットをバラバラに構築できることです。また、新しい情報が利用可能になったときにパラメーターを上書きしてからcreate、最後にメソッドを最終的に呼び出すこともできます。

もう 1 つの潜在的な利点は、最終的なオブジェクトverifyParametersに到達する前に、一貫性をチェックするメソッドを追加できることです。creatingこれは、ファイルやデータベースへの書き込みなど、オブジェクトの作成に元に戻せない手順が含まれる場合に適用されます。

すべてのパターンと同様に、これはすべてのケースに当てはまるわけではなく、あなたのケースにも当てはまるとは限らないことに注意してください。コードが十分に単純な場合、このパターンは過度に設計されている可能性があります。コードが乱雑になっている場合、このパターンにリファクタリングすることは、コードを簡素化する良い方法です。

于 2008-10-10T01:35:09.037 に答える
11
public Booking createVehicleBooking(
    Long officeId, 
    Long start, 
    Long end,
    String origin, 
    String destination, 
    String purpose,                 
    String requirements, 
    Integer numberOfPassengers)

throws ServiceException {
/*..Code..*/
}
于 2008-10-10T01:16:47.013 に答える
3

私は、1 つだけではなく、複数のオブジェクトでそれを行う傾向があります。

だからそれはなる

public Booking createVehicleBooking(Long officeId, DateRange dates, TripDetails trip)

DateRange と Trip の詳細には、データの関連部分のみが含まれます。おそらく、dateRange は旅行の一部である可能性がありますが、要件と乗客数は TripDetails から削除してリクエストの一部にすることができます。

実際、データを細分化する方法はいくつかありますが、大きなリストを関連するパラメーターのグループに分割し、それらのオブジェクトを作成すると、より明確なプログラミング スタイルが可能になり、再利用の可能性が高まります。

そして、オブジェクトをオブジェクトに埋め込むことはいつでも可能であることを覚えておいてください。

public Booking createVehicleBooking(BookingParameters parameters)

BookingParameters には、TripDetails オブジェクトと DateRange オブジェクト、およびその他のパラメーターが含まれています。

于 2008-10-10T02:49:04.130 に答える