Я слышал, как фразу бросают вокруг, и для меня аргументы звучат совершенно безумно (извините, если я здесь играю, это не мое намерение), как правило, это звучит примерно так:
Вы не хотите создавать абстракцию до того, как узнаете, каков общий случай, иначе (1) вы можете помещать в свои абстракции вещи, которые не принадлежат, или (2) пропускать важные вещи.
(1) Для меня это звучит так, как будто программист недостаточно прагматичен, они сделали предположение, что в финальной программе что-то не так, поэтому они работают с низким уровнем абстракции, проблема не в том, преждевременная абстракция, это преждевременная конкреция.
(2) Пропуск важных вещей - это одно, вполне возможно, что что-то пропущено из спецификации, которая впоследствии окажется важной, решение этой проблемы не в том, чтобы придумать собственный конкремент и тратить ресурсы, когда вы обнаружите, что вы угадал, это чтобы получить больше информации от клиента.
Мы должны всегда работать от абстракций до конкрементов, поскольку это самый прагматичный способ ведения дел, а не наоборот.
Если мы этого не сделаем, то мы рискуем неправильно понять клиентов и создать вещи, которые необходимо изменить, но если мы создаем только абстракции, которые клиенты определили на своем собственном языке, мы никогда не сталкиваемся с этим риском (по крайней мере, так близко, как вероятность принятия выстрел в темноте с некоторой конкретностью), да, возможно, клиенты изменят свое мнение о деталях, но абстракции, которые они использовали для первоначального сообщения того, что они хотят, как правило, остаются в силе.
Вот пример, скажем, клиент хочет, чтобы вы создали робота для упаковки предметов:
public abstract class BaggingRobot() {
private Collection<Item> items;
public abstract void bag(Item item);
}
Мы строим что-то из абстракций, которые использовал клиент, не вдаваясь в подробности с вещами, которых мы не знаем. Это чрезвычайно гибко, я видел, что это называется «преждевременная абстракция», когда на самом деле было бы более преждевременным предполагать, как была реализована упаковка, скажем, после обсуждения с клиентом, что они хотят, чтобы более чем один элемент был упакован одновременно , Чтобы обновить мой класс, все, что мне нужно, это изменить подпись, но для кого-то, кто начал снизу вверх, это может потребовать большой перестройки системы.
Нет такой вещи как преждевременная абстракция, есть только преждевременная конкреция. Что не так с этим утверждением? Где недостатки в моих рассуждениях? Спасибо.