Використання занять «товариш» у розробці ігор


9

Зазвичай у програмах C ++ швидкість розвитку ігор оцінюється за допомогою інкапсуляції, тому ви бачите тону загальнодоступних членів класу, які насправді не повинні бути загальнодоступними.

Здається, у більшості випадків я знаходжу, що лише декілька пунктів дійсно потребують відомих внутрішніх функцій інших класів, щоб змінити чи прочитати їхні приватні дані.

Створення загальнодоступних установців для цих приватних даних відкриває речі, які насправді не слід змінювати вольово-невільно.

Чи не буде компромісом тут використовувати товариські класи? чи є якийсь недолік до занять друзями, яких я не бачу.

Відповіді:


8

У класах френдингу є два основних недоліки.

  1. Ви не можете вибрати і вибрати те, що ви хочете викрити перед друзями. Це все або нічого. Це може виявитись проблематичним, якщо ви намагаєтесь застосувати обов'язкове використання якогось невідчуваючого сеттера.
  2. Ваші два заняття зараз дещо поєднані в тому сенсі, що друг-ер знає про друга.

Незважаючи на це, використання занять з друзями, безумовно, може покращити інкапсуляцію, особливо якщо альтернативою є громадські жителі / сетери.

Також пов’язане питання щодо SO: /programming/521754/when-to-use-friend-class-in-c


5

Інкапсуляція приємна, але розділення проблем приємніше.

Клас, що отримує доступ до "деякої приватної частини" іншого класу, може означати, що код не в першу чергу розроблений.

Кожен раз, коли ви опиняєтесь на місці "я хочу зробити тут клас друзів", питання, яке ви повинні задати собі, "чи я це роблю правильно, чи є більш чистий спосіб?" (він же "Це пізніше мене кусає в дупу?").

Якщо ви впевнені в «дружелюбності», покладіть її туди, не вагаючись.


Я розумію, як використання класу друзів щільно з'єднає один клас з іншим. Мені було цікаво, чи існує модель дизайну, яка, зокрема, полегшує проблему, адже просто загортати щось у геттер / сетер - це може бути гіршим рішенням.
Девід Янг

1
Цікавим прикладом є те, що заводський зразок в C ++ вимагає "друга" через використання приватних конструкторів.
Девід Янг

2

Іншим варіантом є використання ідіоми PIMPL , де частина реалізації структури є вказівником на інший тип. Більшість користувачів класу просто включить звичайний файл заголовка, де реалізація є непрозорим покажчиком. Класи, яким потрібен доступ до приватних даних, можуть включати заголовок, що визначає інший тип, та використовувати інтерфейс, який він надає.

Це загальна модель для програмістів на С, які бажають функціонувати як друзів. На мій погляд, він також більш уважно роздумує про розмежування проблем (загалом хороший принцип дизайну, який призводить до багаторазового використання, ортогональний код), а не інкапсуляцію (специфічна для OO методика, яка корисна для здійснення розділення проблем, але також часто неправомірно використовується перекомплікація речей).

Він має перевагу перед другом у тому, що він взагалі не з’єднує друга-ер з другом. Деякі люди можуть стверджувати, що це недолік, оскільки тепер кожен може "подружити" ваш клас. Я думаю, що це невиправданий страх, оскільки ти все ще робиш стосунки явними (включивши заголовок). Якщо ти боїшся цього, ти боїшся своєї (або твоєї колеги) здатності приймати розумні архітектурні рішення. Але якщо ви не можете прийняти ці рішення належним чином, чому ви зараз довіряєте собі friend?

Це має недолік вартості виконання. Зберігаючи дані в покажчику, ви погіршуєте когерентність кешу і більше рахунків розподілу, і вам також потрібен деструктор для його очищення.


+1 цікаво, що не чули про цю концепцію, що походить з фону Java.
Девід Янг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.