所有这些方法都被使用过,没有一种“上下文无关”的最佳实践。在软件工程中,最好的答案通常是“取决于情况”。话虽如此,让我们分析一下每个方法:
1. KISS方法是最简单的方法。我用它来处理基本的“打印到控制台,确保事情正常运行”之类的事情。如果您有一个特定的地址格式,那么这是低成本/易获得胜利的解决方案。您始终可以覆盖此方法或以不同方式打印对象。
2. 这是最具可扩展性的解决方案,因为它将很好地允许本地化和自定义格式。是否适用取决于您预计地址以不同格式显示的频率。您真的需要死星来消灭苍蝇,还是能够更改为全大写或在不同语言之间切换对您的应用程序至关重要?
3. 我不建议使用此方法,因为它通常会将“视图级别”逻辑渗入域中,而这通常最好由其他层(在类MVC方法中)处理。有人可能会认为toString()也会做同样的事情,但toString()也可以被认为是对象在外部世界中出现的“名称”或“本质”,因此我认为它不仅仅是呈现。
希望这可以帮到你,并且赞扬你从一开始就考虑了代码的清晰、解耦和可维护性。
以下是第二个原则的实例——使用
策略模式,遵循
单一职责原则,
开闭原则和通过
依赖注入实现控制反转。请参考下面的方法(由@SteveJ慷慨提供):
public class Address {
private String streetAddress;
private int number;
private String postalCode;
private String city;
private String state;
private String country;
public String toLongFormat(){
return null;
}
public String toShortFormat(){
return null;
}
public String toMailingLabelFormat(){
return null;
}
@Override
public String toString(){
return toShortFormat();
}
}
}
使用这个(在“大部分正确”的Groovy中):
public interface AddressFormatter {
String format(Address toFormat)
}
public class LongAddressFormatter implements AddressFormatter {
@Override
public String format(Address toFormat){
return String.format("%sBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH%n%s", toFormat.streetAddress, toFormat.postalCode)
}
}
public class ShortAddressFormatter implements AddressFormatter {
@Override
public String format(Address toFormat){
return String.format("%d", toFormat.number)
}
}
public class Address {
private String streetAddress;
private int number;
private String postalCode;
private String city;
private String state;
private String country;
public AddressFormatter formatter = new ShortAddressFormatter();
public void setFormatter(AddressFormatter fr) { this.formatter = fr; }
@Override
public String toString(){
return formatter.format(this);
}
}
def addrr = new Address(streetAddress:"1234 fun drive", postalCode:"11223", number:1)
addr.setFormatter(new LongAddressFormatter());
println "The address is ${addrr}"
addr.setFormatter(new ShortAddressFormatter());
println "The address is ${addrr}"
正如@SteveJ所观察到的:
"因此,您拥有不同的格式化“策略”,可以在它们之间切换...我有这样一个想法,您只需设置一次格式,然后就会被困住...如果您想要添加另一种格式化样式,则无需打开并重写地址类,而是编写一个新的单独样式,并在需要使用时注入它。"