Разве нет места, где инкапсуляция становится смешной? - PullRequest
11 голосов
/ 11 ноября 2009

Для моего класса программирования по разработке программного обеспечения мы должны были создать программу типа «Менеджер каналов» для каналов RSS. Вот как я справился с реализацией FeedItems.

Красиво и просто:

struct FeedItem {
    string title;
    string description;
    string url;
}

Я получил за это оценку, «правильный» пример ответа следующий:

class FeedItem
{
public:
    FeedItem(string title, string description, string url);

    inline string getTitle() const { return this->title; }
    inline string getDescription() const { return this->description; }
    inline string getURL() const { return this->url; }

    inline void setTitle(string title) { this->title = title; }
    inline void setDescription(string description){ this->description = description; }
    inline void setURL(string url) { this->url = url; }

private:
    string title;
    string description;
    string url;
};

Теперь мне это кажется глупым. Я, честно говоря, не могу поверить, что меня понизили, когда это делает то же самое, что мое делает с гораздо большими накладными расходами.


Это напоминает мне о том, как в C # люди всегда делают это:

public class Example
{
    private int _myint;

    public int MyInt
    {
        get
        {
            return this._myint;
        }
        set
        {
            this._myint = value;
        }
    }
}

Я имею в виду, что я GET зачем они это делают, может позже они захотят проверить данные в установщике или увеличить их в получателе. Но почему вы, люди, просто НЕ ДЕЛАЕТЕ ЭТУ ДО такой ситуации?

public class Example
{
    public int MyInt;
}

Извините, это что-то вроде разглагольствования, и на самом деле это не вопрос, но избыточность сводит меня с ума. Почему добытчики и сеттеры так любимы, когда они не нужны?

Ответы [ 13 ]

1 голос
/ 11 ноября 2009

Совершенно очевидно, что инкапсуляция становится нелепой.

Чем больше абстракции, которая вводится в код, тем выше будет ваше начальное образование, и стоимость обучения будет кривой. Каждый, кто знает C, может отлаживать ужасно написанную 1000-строчную функцию, которая использует только стандартную библиотеку языка C. Не каждый может отладить созданный вами фреймворк. Каждый введенный уровень инкапсуляции / абстракции должен быть сопоставлен с затратами. Это не значит, что оно того не стоит, но, как всегда, вы должны найти оптимальный баланс для вашей ситуации.

1 голос
/ 11 ноября 2009

Как разработчик C ++, я делаю своих членов всегда приватными, просто чтобы быть последовательными. Поэтому я всегда знаю, что мне нужно набирать p.x (), а не p.x.

Кроме того, я обычно избегаю реализации методов установки. Вместо изменения объекта я создаю новый:

p = Point(p.x(), p.y() + 1);

Это также сохраняет инкапсуляцию.

0 голосов
/ 11 ноября 2009

Я согласен с вами, но важно выжить в системе. Находясь в школе, делайте вид, что согласны. Другими словами, помеченное имя вредно для вас, и не стоит того, чтобы вас унижали за ваши принципы, мнения или ценности.

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

Инкапсуляция теоретически полезна в случае, если внутренняя реализация когда-либо изменится. Например, если URL для каждого объекта стал вычисленным результатом, а не сохраненным значением, то инкапсуляция getUrl () продолжит работать. Но я подозреваю, что вы уже слышали эту сторону.

...