'Зло' как .getAttention ()
Это часто обсуждалось, и даже, возможно, получилось немного вирусным в результате уничижительного термина "Зло", использованного в диалоге.Конечно, есть 1003 раза, когда они вам нужны.Но проблема в том, чтобы правильно их использовать.Видите ли, разглагольствования профессора Голуба связаны не с тем, что ваш код делает сейчас , а с тем, что заключает в себе , так что изменения в будущем болезненны и подвержены ошибкам.
На самом деле все, что я прочитал, несет в себе эту тему.
Как эта тема относится к классу Item ?
Взгляд в будущееof Item
Вот класс предметов фикций:
class Item{
private double price;
public void setPrice(final double price){
if(isValidPrice(price))
this.price = price;
else throw new IllegalArgumentException(price+" is not valid!");
}
public double getPrice(){
return this.price;
}
}
Это все хорошо и хорошо, но это все еще «Зло» в том смысле, что это может причинить вам много горя вбудущее.
Горе склонно исходить из того факта, что однажды «цена» может принимать во внимание разные валюты (и, возможно, даже более сложные бартерные схемы).Если установить цену равной двойному, любой код, который написан между настоящим моментом и «апокалипсисом» (в конце концов, мы говорим о зле), увеличит цену до двойного.
Это намного лучше (дажеХорошо, возможно) передать объект Price вместо double.Тем самым вы можете легко вносить изменения в то, что вы подразумеваете под «ценой», не нарушая существующие интерфейсы.
Вывод на получение и установщик
Если вы обнаружите, что используете средства получения и установки на простыетипы, убедитесь, что вы учитываете возможные будущие изменения интерфейса.Есть очень хороший шанс, что вы не должны быть.Вы используете setName(String name)
?Вы должны учитывать setName(IdentityObject id)
или даже setIdentity(IdentityObject id)
на случай, если появятся другие идентификационные модели (аватары, ключи, что угодно).Конечно, вы всегда можете обойтись и setAvatar
и setKey
во всем, но, используя объект в сигнатуре вашего метода, вы упростите в будущем расширение до объектов, которые могут использовать новые свойства идентификатора и не разрушать устаревшееобъекты.