Нещодавно я здійснив рефакторинг середнього розміру проекту на 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звучить, як це має бути незмінним, але може мати різні стратегії, які вибираються серед створення.