2012-08-16 47 views
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); 
} 

問題是 - 有沒有更好的方法來做到這一點,而無需創建大量的格式化方法?也許是單一的靜態格式化方法?你如何做這個數字值格式化?

回答

0

所以你在這裏有一個人對象,他們是負責不少東西:
1)格式化日期
2)的標誌和一個字符串
3)之間的轉換性別轉換測量

將您的對象限制爲一組相關責任是一種最佳做法。我會嘗試爲其中的每一個創建一個新的對象。實際上,如果我對Single Responsibility Principle嚴格要求,我甚至會推薦一個用於在各種值之間轉換的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() + "\""); 
    } 
    } 
0

我不認爲你可以逃脫一個格式化的方法,因爲不同的屬性有不同的要求。但一對夫婦的指引可以讓你的生活變得更輕鬆:

單獨從模型代碼視圖代碼:有一個單獨的PersonView類返回合適的信息爲你的HTML輸出:

public class PersonView { 
    private Person person; 

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

    ... 
} 

使用強類型的屬性,而不是原語:

  • 使用日期對象,而不是一個整數時間戳。
  • 爲性別而不是整數創建一個枚舉。
  • 使用單位創建高度和重量類,而不是使用單位的整數。
相關問題