Нещодавно я здійснив рефакторинг середнього розміру проекту на Java, щоб повернутися назад та додати тестові одиниці. Коли я зрозумів, який біль викликати знущання над одинаками та статикою, я нарешті «дістав» те, що читав про них увесь цей час. (Я один з тих людей, яким потрібно вчитися на досвіді. Ну добре.)
Отже, тепер, коли я використовую Spring для створення об’єктів і обведення їх навколо, я позбавляюся static
ключових слів ліворуч та праворуч. (Якщо я можу потенційно захотіти знущатися над цим, це насправді не є статичним у тому ж сенсі, що Math.abs (), правда?) Справа в тому, що я ввійшов у звичку використовувати, static
щоб позначити, що метод не покладається на будь-який стан об'єкта. Наприклад:
//Before
import com.thirdparty.ThirdPartyLibrary.Thingy;
public class ThirdPartyLibraryWrapper {
public static Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
ThirdPartyLibraryWrapper.newThingy(input);
//After
public class ThirdPartyFactory {
public Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
thirdPartyFactoryInstance.newThingy(input);
Отже, ось, де це стає чуйним. Мені сподобався старий спосіб, оскільки велика літера сказала мені, що так само, як і Math.sin (x), ThirdPartyLibraryWrapper.newThingy (x) робив те саме, що і те саме щоразу. Немає стану об'єкта, який би міг змінити те, як об’єкт робить те, про що я його прошу. Ось кілька можливих відповідей, які я розглядаю.
- Ніхто більше не відчуває себе таким чином, тож зі мною щось не так. Можливо, я просто насправді не усвідомлював OO способу ведення справ! Можливо, я пишу на Java, але думаю в FORTRAN або щось подібне. (Що було б вражаючим, оскільки я ніколи не писав FORTRAN.)
- Можливо, я використовую статичність як свого роду проксі для незмінності для міркувань про код. Якщо говорити, які підказки я повинен мати у своєму коді для того, щоб хтось прийшов, щоб підтримати його, щоб знати, що таке стан, а що ні?
- Можливо, це повинно вийти безкоштовно, якщо я оберу хороші метафори об’єктів? наприклад
thingyWrapper
, не звучить так, що він має стан незалежного від загорнутого,Thingy
який може сам змінюватися. Так самоthingyFactory
звучить, як це має бути незмінним, але може мати різні стратегії, які вибираються серед створення.