1

これはソフトウェア設計/ベスト プラクティスに関する質問です。オブジェクト属性の文字列値を便利に取得する最もエレガントな方法は何ですか?

次の例を検討してください。

数値が整数として保存されたモデルがあります。

class Person {
   integer time_of_birth; // unix timestamp
   integer gender; // 1 - male, 2 - female
   integer height; // number of millimeters
   integer weight; // number of grams
   string name;
}

意味のあるビュー (HTML ページなど) を作成するには、数値情報を人間が読める形式 (文字列) で出力する必要があります。これまでのところ、文字列以外の属性の文字列表現を返すメソッド「attributename_str()」を追加することでそれを行っています。

method time_of_birth_str() {
   return format_date_in_a_sensible_manner(this.time_of_birth);
}

method gender_str() {
   if this.gender == 1 return 'male';
   if this.gender == 2 return 'female';
}

method height_str(unit, precision) {
   if unit == meter u = this.height/some_ratio;
   if unit == foot u = this.heigh/different_ratio;
   return do_some_rounding_based_on(precision,u);
}

質問は - 多数のフォーマット方法を作成せずに、これを行うためのより良い方法はありますか? おそらく単一の静的フォーマット方法ですか?この数値の書式設定はどのように行うのですか?

4

2 に答える 2

0

属性が異なれば要件も異なるため、単一のフォーマット方法で解決できるとは思いません。しかし、いくつかのガイドラインはあなたの人生をはるかに楽にすることができます:

ビューコードをモデルコードから分離PersonViewします。HTML出力に適した情報を返す別のクラスを用意します。

public class PersonView {
  private Person person;

  public String getTimeOfBirth() {
    return formatDate(person.getTimeOfBirth());
  }

  ...
}

プリミティブの代わりに強く型付けされたプロパティを使用します。

  • 整数のタイムスタンプの代わりに日付オブジェクトを使用します。
  • 整数の代わりに性別の列挙型を作成します。
  • 単位を想定する整数ではなく、単位を使用して身長と体重のクラスを作成します。
于 2012-08-17T01:52:01.620 に答える
0


1) 日付のフォーマット2)フラグ
と文字列の間での性別の
変換 3) 測定値の変換

オブジェクトを関連する責任の 1 つのセットに制限することをお勧めします。これらのそれぞれに対して新しいオブジェクトを作成しようとします。

実際、私が単一責任の原則について厳密である場合、さまざまな値の間で変換するための Measurement クラス (ここに変換定数を保存します) と、それを適切な方法でフォーマットすることを担当する別の MeasurementPrinter クラスをお勧めします (例: 6 フィート、2 インチまたは 6' 2" など)。

私が言いたいことの具体例をあげるために

 public class Person {
   private Height height;
 }

 public class Height {
   private static final double FT_TO_METERS = // just some example conversion constants

   private int inches;

   public double toFeet() {
     return inches / IN_PER_FEET;
   }

   public double toMeters() {
     return toFeet() * FT_TO_METERS;
   } 

だから今、人は測定値の変換について何も知りません。

先ほど言ったように、次のようなプリンター オブジェクトを作成することもできます。

   public class HeightPrinter {

     public void printLongFormat(Height height) 
     {
       print(height.getFeet() + " feet, " + height.getInches() + " inches");
     }

     public void printShortFormat(Height height) 
     {
       print(height.getFeet() + "', " + height.getInches() + "\"");
     }
   }
于 2012-08-16T20:46:20.553 に答える