Коли я розділяю великі методи (або процедури, або функції - це питання не характерне для OOP, але оскільки я працюю в мовах OOP 99% часу, саме термінологія мені найбільше подобається) на безліч маленьких , Я часто виявляю себе незадоволеним результатами. Міркувати про ці маленькі методи стає важче, ніж тоді, коли вони були просто блоками коду у великому, тому що, витягуючи їх, я втрачаю багато припущень, що випливають із контексту абонента.
Пізніше, коли я переглядаю цей код і бачу окремі методи, я не одразу знаю, звідки вони викликані, і думаю про них як про звичайні приватні методи, які можна викликати з будь-якого місця у файлі. Наприклад, уявіть, що метод ініціалізації (конструктор або іншим чином) розділився на ряд невеликих: у контексті самого методу ви чітко знаєте, що стан об'єкта все ще недійсний, але в звичайному приватному методі ви, ймовірно, виходите з припущення, що об'єкт вже ініціалізований і знаходиться у дійсному стані.
Єдине рішення, яке я бачив для цього, - це where
пункт Haskell, який дозволяє визначити невеликі функції, які використовуються лише у функції "батьків". В основному, це виглядає приблизно так:
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
Але інші мови, якими я користуюся, не мають нічого подібного - найближчим моментом є визначення лямбда в локальному масштабі, що, мабуть, ще більше заплутує.
Отже, моє запитання - чи стикаєтесь ви з цим, і чи бачите ви, що це проблема? Якщо це так, як ти зазвичай це вирішуєш, особливо в "основних" мовах OOP, як-от Java / C # / C ++?
Редагувати щодо дублікатів: Як зауважили інші, вже є питання, що обговорюють методи розщеплення та невеликі запитання, що є однорядними. Я читаю їх, і вони не обговорюють питання про основні припущення, які можуть бути отримані з контексту абонента (наприклад, вище, ініціалізований об'єкт). Це суть мого питання, і саме тому моє запитання різне.
Оновлення: Якщо ви дотримувались цього питання та обговорення під ним, вам може сподобатися ця стаття Джона Кармака з цього питання , зокрема:
Крім усвідомлення фактичного коду, який виконується, функції вбудовування також мають перевагу в тому, що він не дозволяє викликати функцію з інших місць. Це звучить смішно, але в цьому є сенс. Оскільки база коду зростає з роками використання, з’явиться багато можливостей скористатися ярликом і просто зателефонувати до функції, яка виконує лише ту роботу, яку ви вважаєте за потрібну. Можливо, існує функція FullUpdate (), яка викликає PartialUpdateA (), і PartialUpdateB (), але в певному конкретному випадку ви можете зрозуміти (або подумати), що вам потрібно зробити лише PartialUpdateB (), і ви будете ефективними, уникаючи іншого робота. З цього випливає багато і багато помилок. Більшість помилок є результатом того, що стан виконання не є таким, яким ви вважаєте, що це таке.