Це залежить від того, де ви стоїте в циклі розробки, але іноді, коли накреслюєте алгоритм, ви хочете зробити абстракцію про складні блоки, не реалізуючи їх відразу.
def full_algo():
init_stuff()
process_stuff()
...
Ви знаєте, як init_stuff
буде працювати, це досить просто в голові, але вам це дійсно не потрібно відразу, тому ви оголошуєте це як порожню функцію. Це дозволить вашому коду збирати та запускати, не турбуючись про деталі горі.
Ще одне використання для випущених додатків - це при використанні спадщини. Припустимо, у вас великий клас, який визначає поведінку конкретного коду платформи. У вас може виникнути логіка, подібна до цієї:
init_filesystem();
access_files();
release_filesystem();
Цей код буде працювати на багатьох платформах, але деякі платформи можуть не потребувати ініціалізації файлової системи. Тоді ваше успадкування буде виглядати приблизно так (віртуальний з = 0 у C ++ означає, що похідні класи ОБОВ'ЯЗКОВО реалізують ці методи):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
Тоді певна реалізація цього класу (інтерфейс) може нічого не робити для деяких із цих методів. Крім того, базовий клас може оголосити порожні методи для init / release замість того, щоб оголосити їх віртуальними.
Нарешті (і соромно), іноді ви підтримуєте дуже старий додаток. Ви побоюєтесь, що видалення методів порушить справи. Це відбувається, коли у вас є складне успадкування, яке не зрозуміло належним чином, або коли у вас є багато покажчиків функцій (зворотних викликів). Ви просто видалите код всередині них, щоб вони все одно викликали, нічого не порушуючи.