Как сделать доступными только те публичные методы, которые объявлены в интерфейсе? - PullRequest
0 голосов
/ 16 февраля 2019

Например, в Java это происходит из-за статической природы языка.Но в PHP это также может быть полезно, особенно для обеспечения безопасности и чистоты кода с архитектурной точки зрения.

Например, у нас есть следующий код:

interface DocumentProcessorInterface

   public function process();

}

class GameSaveProcessorImpl implements DocumentProcessorInterface {

    public function process() {
        // do something useful
    }

    public function methodToSetSomethingFromFriendClass() {
       // setting private fields, some postponed initialization/resetting, etc
    }

}

Затем изнекоторый класс (назовем его «класс друга», потому что он лежит рядом с классом GameSaveProcessorImpl и дополняет его), мы вызываем метод methodToSetSomethingFromFriendClass.Из-за PHP-утки, такая возможность вызова этого метода также доступна для любого чужого клиентского кода, но этот метод не для такого использования.Код чужого (внешнего) клиента ДОЛЖЕН использовать только методы DocumentProcessorInterface (это одна из причин, по которой мы вообще используем интерфейсы).

Есть несколько решений, которые приходят на ум.

1) Просто оставьте все как есть, но переименуйте открытые методы, которые не находятся в интерфейсах, так что это работает как предупреждение для тех сторонних разработчиков кода клиентаНапример, переименуйте methodToSetSomethingFromFriendClass в internalUseOnly_methodToSetSomethingFromFriendClass.Снижает риск случайного использования, но не запрещает вызов методов технически.

2) Использование шаблона адаптера (декоратора).Перейдите к внешнему коду только с декорированным экземпляром, у которого нет метода methodToSetSomethingFromFriendClass.Это решает проблему нежелательного доступа к методу, но сильно усложняет другие части нашего кода.Кажется, что нет никакой общей прибыли.

3) Пока еще не проверено жизнеспособность этой идеи: используйте следующий факт.Базовый класс может объявлять защищенный метод, поэтому все дочерние классы, которыми мы управляем, могут быть расширены из этого базового класса, оставляя наш methodToSetSomethingFromFriendClass метод отмеченным как защищенный, эффективно защищенный от внешнего кода, но вызываемый из класса «друга».Технически это обеспечивает защиту, но требует, чтобы классы-друзья унаследовали от общего базового класса, недостатки этого хорошо известны.

Знаете ли вы что-нибудь лучше?Ссылки на статьи приветствуются, а также делятся опытом по этой теме исследования.

...