2013-06-20 3 views
2

У меня есть вопрос, связанный с тем, как создать класс с использованием объектно-ориентирующих языков, таких как C++. Во многих случаях переменные могут быть назначены членам класса или аргументам функции. Я даю следующие примеры, чтобы сделать мою точку ясно:Член класса vs аргумент функции

class MyClass 
{ 
public: 
    int variable1; 
    int variable2: 
    MyClass (int vr1, int vr2) 
    { 
    variable1 = vr1; 
    variable2 = vr2; 
    } 
    bool perform_one_task() 
    { 
    // do something 
    return true; 
    } 
} 

Когда мы хотим использовать этот класс, мы можем использовать следующие коды:

int a,b; 
    MyClass mine(a,b); 
    mine.perform_one_task(); 

Это также можно создать класс без variable1 и variable2.

class MyClass 
    { 
    public: 

     bool perform_one_task(int variabl1, int variable2) 
     { 
     // do something 
     return true; 
     } 
    } 

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

+2

когда дизайн класс (тип), всегда задает себе вопрос: действительно MyClass имеет такое свойство или атрибут? – billz

ответ

0

Что такое класс, на самом деле моделирующий? Что нужно инкапсулировать? И кто на самом деле владеет, что данные?

В первом примере участники представляют собой деталь реализации. Они скрыты от пользователей/клиентов класса, и вы можете заменить их и полностью изменить реализацию. Клиенты метода perform_one_task() не знают, что эти поля существуют.

например. ваш класс может представлять координату 2-d, а ваши члены - атрибуты X/Y. На каком-то этапе вы можете изменить этот класс, чтобы представить координату в полярных терминах (угол + радиус). API для класса координат останется прежним, но реализация будет принципиально иной.

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

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

0

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

0

Согласно принципам объектно-ориентированного программирования (OOP), когда вы разрабатываете свой класс, вы обычно выбираете, какие атрибуты объекта (состояние) и какие будут методы объекта (поведение). Здесь методы могут иметь входные параметры. Поэтому мы могли бы переформулировать ваш вопрос: В чем разница между атрибутами объекта и параметрами метода.

Атрибуты объекта - это его свойства, которые характеризуют этот объект (характеристики состояния), например. Трехмерная точка характеризуется тремя координатами: x, y, z; Круг характеризуется центральными координатами и радиусом.

Методы объекта (поведение) - это вычисления, применяемые к этому объекту, например. треугольник может иметь такие методы, как calculateSquare(), calculatePerimeter(), поворот (угол), движение (newX, Newy) и т.д.

И наконец параметры метода являются входными данными для этого метода, но они не являются объектом свойства. Например. Объект 2D-формы может вращать метод (угол), где угол не является свойством объекта формы, а является входным параметром для метода вращения, а именно углом поворота фигуры.

0

Ваш первый пример объектно-ориентированный (при условии, что perform_one_task() использует переменные!). Второй пример - нет, это просто функция, завернутая в пустую оболочку класса.

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

Если вы попробуете добавить еще одну задачу к своим примерам, то вы увидите, что во втором примере вы просто получите две несвязанные функции, тогда как в первом примере каждая задача имеет возможность работать с одними и теми же данными ,

0

Члены класса являются членами класса. Это свойства экземпляра объекта класса или статические значения, используемые всем классом, поэтому значения тесно связаны с классом.

Вы не храните в своих значениях классов, которые не моделируют ваш класс, если они вам не нужны (и тогда они действительно моделируют ваш класс на самом деле). Это не нужно и тратить ресурсы. Всегда избегайте ненужных переменных. Так в основном:

class MyClass{ 
public: 
    bool perform_one_task(int onlyMethodArg1, int onlyMethodArg2){ 
    // do something 
    return true; 
    // onlyMethodArgs are gone since nobody really needs them, we are interested 
    // only in result of calculation 
    } 
void saveProperties(int prop1, prop2){ 
    property1=prop1; 
    property2=prop2; 
} 
private: 
    int property1; 
    int property2; 
}; 
Смежные вопросы