Как мне решить, стоит ли создавать «защищенный интерфейс»? - PullRequest
1 голос
/ 04 февраля 2012

От: http://www.parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.9

Три клавиши: ROI, ROI и ROI.

Каждый созданный вами интерфейс имеет свою цену и выгоду. Каждый многоразовый Компонент, который вы строите, имеет стоимость и выгоду. Каждый тестовый случай, каждый Чисто структурированная вещь-ма-боб, каждая инвестиция любого рода. Вы никогда не следует вкладывать время или деньги в любую вещь, если нет положительный возврат на эти инвестиции. Если это стоит вашей компании больше чем это экономит, не делайте этого!

Не все со мной согласны; они имеют право быть неправыми. Например, люди, которые живут достаточно далеко от реального мира, действуют Как и все инвестиции это хорошо. Ведь они рассуждают, если подождать достаточно долго, это может когда-нибудь сэкономить кому-то время. Может быть. Мы надеемся.

Вся эта линия рассуждений непрофессиональна и безответственна. Вы не иметь бесконечного времени, поэтому вкладывайте его с умом. Конечно, если вы живете в Башня из слоновой кости, вам не нужно беспокоиться о тех неприятных вещах, которые называются «графики» или «клиенты». Но в реальном мире вы работаете в график, и поэтому вы должны тратить свое время только там, где вы будете получить хорошую окупаемость.

Вернуться к первоначальному вопросу: когда следует инвестировать время в строительство защищенный интерфейс? Ответ: когда вы получите хорошую отдачу от этого инвестиций. Если это будет стоить вам час, убедитесь, что это экономит кто-то больше часа, и убедитесь, что экономия не "когда-нибудь за радугой. "Если вы можете сэкономить час в рамках текущего проекта, это не просто: пойти на это. Если он собирается сохранить какой-то другой проект час когда-нибудь, может быть, мы надеемся, тогда не делай этого. И если это в между, ваш ответ будет зависеть от того, как именно ваша компания торгует От будущего к настоящему.

Суть проста: не делайте то, что может повредить график. (Или, если вы это сделаете, убедитесь, что вы никогда не работаете со мной; я буду иметь Ваша голова на блюде.) Инвестировать хорошо, если есть окупаемость эти инвестиции. Не будь наивным и ребяческим; расти и понимать, что некоторые инвестиции плохие, потому что в итоге они стоят больше, чем они вернуться.

Ну, я не понял, как соотнести это с защищенным интерфейсом C ++.

Пожалуйста, приведите реальные примеры C ++, чтобы показать, о чем идет речь в этом FAQ.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Прежде всего, никогда не рассматривайте какие-либо ссылки на программирование как окончательные.Когда-либо.Все является чьим-то мнением, и, в конце концов, вы должны делать то, что лучше для вас.

Итак, в этом тексте, по сути, говорится: «Не используйте методы, которые стоят вам больше времени, чемони экономят ".Один из примеров «защищенного интерфейса», который они описывают, следующий:

class C {
    public:
        int x;
};

Теперь в Java все книги по программированию на Java EE говорят вам, что вы всегда должны реализовывать этот класс следующим образом:

class C {
    public:
        int getX() { return x; }
        void setX(int x) { this.x = x; }
    private:
        int x;
};

... это реализация правильной инкапсуляции (технический термин: немного упрощая, это означает минимизацию совместного использования между отдельными частями).Классы, использующие ваш код, обеспокоены тем, что у вас есть какой-то способ получить и установить целое число, а не то, что он фактически хранится как int внутри класса.Поэтому, если вы используете методы доступа, вы сможете позже изменить базовую реализацию: может быть, вы хотите, чтобы она считывала эту переменную из сети?

Однако это был большой объем дополнительного кода (в терминахперсонажей) и некоторые дополнительные сложности для реализации этого.Делать вещи правильно на самом деле имеет свою стоимость!Это не затраты с точки зрения правильности кода - напрямую - но вы потратили несколько минут, делая это «лучше», чем могли бы потратить на что-то другое, и для поддержания всего, что вы пишете, требуется ненулевой объем работы,независимо от того, насколько это тривиально.

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

Это совет, который вам пригодится на любом языке программирования и на любом языке.жизненный путь.

0 голосов
/ 04 февраля 2012

Из приведенной выше цитаты парень звучит как педантичный придурок:)

Глядя на предыдущие записи в своем FAQ, он действительно говорит следующее:

1) Класс имеет два отдельных интерфейса для двух различных наборов клиентов:

  • Он имеет открытый интерфейс, который обслуживает несвязанные классы
  • Он имеет защищенный интерфейс, который обслуживает производные классы

2) Всегда ли вам нужно создавать два разных интерфейса для каждого класса?

3) Ответ: «нет, не обязательно»

  • Иногда стоит приложить дополнительные усилия для создания защищенных методов получения и установки и сделать все данные «частными»

  • В других случаях, - говорит он, - «достаточно хорошо», чтобы сделатьсами данные "защищены".Без проделывания всей дополнительной работы по написанию связки дополнительного кода и влечению за собой штрафов за размер и производительность.

    Звучит разумно для меня.Делайте то, что вам нужно , но не переборщите и сделайте кучу ненужных вещей во имя «теории».

Это все, что он говорит - используйте здравый смысл и не переусердствуйте.

С этим не поспоришь:)

PS:

Часто задаваемые вопросы с 19,5 по19.9 по вашей ссылке разберитесь с "производными классами".Ничто из этого обсуждения не имеет отношения вне вопроса "как мне структурировать базовые классы для наследования?"Другими словами, это , а не обсуждение "классов" в целом - только о том, "как суперкласс должен лучше всего делать вещи видимыми для его подклассов?".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...