@equentor

Инкапсуляция (сокрытие реализации), как правильно использовать?

Добрый день.
Разбираясь с этим приложением, написанном на функциях, я обратил внимание что имена некоторые функций начинаются с "_". Погуглив, я понял, что это обозначает "приватность" этих функций. Но я не могу понять по какому принципу это сделано?

Одно дело, если я использую какой-либо сторонний пакет подключенный в моем приложении, автор пакета предоставляет мне некоторое публичное API которым я и буду пользоваться, а детали реализации он от меня скрывает (скорее всего, потому-что приватные методы являются служебными, и вне контекста его класса их использование не имеет смысла), а если приложение без сторонних пакетов? Если приложение является монолит, а тем более как по ссылке - на функциях?

В принципе я взял почти весь код оттуда, но там нет логики работы с базой данных. Я реализовал эту логику (частично):

function database_getConnect(string $dsn, string $username, string $passwd): PDO {
    return new PDO($dsn, $username, $passwd);
}

function database_select(string $table, array $columns = ['*'], array $whereCond = []): array {
    $dbh = database_getConnect(DATABASE_DSN, DATABASE_USERNAME, DATABASE_PASSWD);
    // ...
    return $result;
}

function getUserByID(int $id): array {
    return database_select('users', ['*'], [':id' => $id]);
}


Что из этого должно быть НЕ публичным? Я задаю себе вопросы:
1. Могу ли я захотеть получить в случае чего экземпляр подключения где угодно напрямую? - Да, мало ли, вдруг придётся написать сложный запрос вручную.
2. Могу ли я захотеть напрямую вызвать и передать параметры в database_select, а не писать конкретную обёртку по типу getUserByID? - Да, это ведь обёртка над select, представленная в виде функции, конечно она может понадобиться где угодно сама по себе.
3. Тут думаю всё и без вопроса понятно.

Я не верно понимаю инкапсуляцию? Задаюсь не теми вопросами? Что, где и от кого следует скрывать?

Допустим, взять отсюда информацию:


Инкапсуляцию можно сравнить с работой автомобиля с точки зрения типичного водителя. Многие водители не разбираются в подробностях внутреннего устройства машины, но при этом управляют ею именно так, как было задумано. Пусть они не знают, как устроен двигатель, тормоз или рулевое управление, — существует специальный интерфейс, который автоматизирует и упрощает эти сложные операции.


Но как мыслить при написании кода, когда ты являешься и заводом-изготовителем автомобиля, и его будущим водителем одновременно?
  • Вопрос задан
  • 223 просмотра
Решения вопроса 1
BojackHorseman
@BojackHorseman Куратор тега PHP
...в творческом отпуске...
вопрос задан некорректно. ЧТО ДОЛЖНО БЫТЬ ПУБЛИЧНЫМ.

ООП в PHP кривое изначально и дефолтовый модификатор для свойств и методов - public, ибо в 4.х модификаторов вообще не было и эту дрянь оставили для обратной совместимости.

приучите себя объявлять все через private, за исключением двух случаев.
1. свойство или метод должно быть доступно всем (очевидно public).
2. свойство или метод должно быть доступно только классу или его наследникам (очевидно protected).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
Но я не могу понять по какому принципу это сделано?

это пережитки до ide'шной эпохи
Что из этого должно быть НЕ публичным?

некоторые функции используются только внутри класса/простравства имен и поэтому не являются публичными, при работе с ide это очень полезно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
App-Smart Краснодар
от 2 000 до 2 500 eur.
Элерон Москва
от 120 000 до 160 000 руб.
Гарда Технологии Санкт-Петербург
от 250 000 руб.
16 июл. 2019, в 12:33
20000 руб./за проект
16 июл. 2019, в 12:18
5000 руб./за проект