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)转换测量值

将您的对象限制为一组相关职责是最佳实践。我会尝试为其中的每一个创建一个新对象。

事实上,如果我严格遵守单一职责原则,我什至会推荐一个用于在各种值之间进行转换的 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 回答