Терминология ООП: класс, атрибут, свойство, поле, член данных

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

Я посмотрел класс С++, класс java, и я хочу знать достаточно, чтобы написать свой собственный псевдокласс, чтобы помочь мне понять.

Например, в в этой статье Я прочитал этот атрибут (.. class (или свойство класса, поле или элемент данных)

Я довольно хорошо вырезал вопросы, которые показывают, что существует различие между свойством класса и полем класса, например В чем разница между полем и свойством в С#?

В зависимости от того, на каком языке я изучаю, есть определение

  • Свойство
  • Поля
  • Переменные класса
  • Свойства

отличается от языка и языка?

Ответ 1

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

"Свойства" на большинстве языков, которые я использую, что-то другое - это способ привязки настраиваемого поведения к чтению/записи поля. (Или заменить его.)

Итак, в Java канонический пример:

class Circle {

    // The radius field
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }

    // The radius property
    public double getRadius() {
        return radius;
    }
    public double setRadius(double radius) {
        // We're doing something else besides setting the field value in the 
        // property setter
        System.out.println("Setting radius to "+radius);
        this.radius = radius;
    }

    // The circumference property, which is read-only
    public double getCircumference() {
        // We're not even reading a field here.
        return 2 * Math.PI * radius;
    }

}

(Обратите внимание, что в Java свойство foo - это пара методов доступа, называемых getFoo() и setFoo(), или только получатель, если свойство доступно только для чтения.)

Ответ 2

Я проработал более 20 лет, и я обнаружил, что люди часто используют разные слова для одних и тех же вещей. Я понимаю, что поля, переменные класса и атрибуты означают одно и то же. Однако свойство лучше всего описывает fooobar.com/questions/12399/..., которую вы включили в свой вопрос.

Ответ 3

Эй, ты ничего не знаешь Джон Сноу,

Я согласен с вами, существует много ненужной путаницы из-за нечетких определений и непоследовательного использования многих условий OO. Термины, о которых вы просите, используются несколько взаимозаменяемо, но можно сказать, что некоторые из них более общие, чем другие (убывающий порядок): Свойство → Атрибуты → Переменные класса → Поля.

Следующие отрывки, извлеченные из "Объектно-ориентированного анализа и проектирования" Грэди Буча, помогают уточнить этот вопрос. Во-первых, важно понять концепцию состояния:

Состояние объекта объекта включает в себя все (обычно статические) свойства объекта и текущие (обычно динамические) значения каждого из этих свойств. По свойствам мы имеем в виду совокупность атрибутов объекта и отношений с другими объектами.

ООП является довольно общим в отношении определенной номенклатуры, поскольку он сильно варьируется от языка к языку:

Термины (Object Pascal), переменная экземпляра (Smalltalk), объект-член (С++) и слот (CLOS) являются взаимозаменяемыми, что означает репозиторий для части состояния объекта. В совокупности они составляют структуру объекта.

Но нотация, введенная автором, точна:

Атрибут обозначает часть совокупного объекта и поэтому используется во время анализа, а также дизайн, чтобы выразить исключительное свойство класса. Используя синтаксис, не зависящий от языка, атрибут может иметь имя, класс или и то, и другое, а необязательное выражение по умолчанию: A:C=E.

Переменная класса: Часть состояния класса. В совокупности переменные класса класса составляют его структуру. Переменная класса разделяется всеми экземплярами одного и того же класса. В С++ переменная класса объявляется как статический член.

Вкратце:

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

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

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

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

Приветствия

Ответ 4

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

В С#....

Поле - это переменная, которая существует для данного экземпляра класса.

например.

public class BaseClass
{
    // This is a field that might be different in each instance of a class
    private int _field; 

    // This is a property that accesses a field
    protected int GetField
    {
        get
        {
            return _field;
        }
    }
}

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

Свойство позволяет вам получить (иногда называемый аксессуром) или установить (иногда называемый мутатором) значение поля... Свойства позволяют вам делать пару вещей, препятствуя написанию поля, например, вне класса, изменение видимость поля (например, частный/защищенный/открытый). Мутатор позволяет вам предоставить некоторую пользовательскую логику перед установкой значения поля

Таким образом, свойства больше похожи на методы получения/установки значения поля, но обеспечивают большую функциональность

например.

public class BaseClass
{
    // This is a field that might be different in each instance of a class
    private int _field; 

    // This is a property that accesses a field, but since it visibility 
    // is protected only subclasses will know about this property 
    // (and through it the field) - The field and property in this case
    // will be hidden from other classes.
    protected int GetField
    {
        // This is an accessor
        get
        {
            return _field;
        }
        // This is a mutator
        set
        {
            // This can perform some more logic
            if (_field != value) 
            {
                 Console.WriteLine("The value of _field changed");
                 _field = value;
                 OnChanged; // Call some imaginary OnChange method
            } else {
                 Console.WriteLine("The value of _field was not changed");
            }
        }
    }
}

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

public class BaseClass
{
    // A static (or class variable) can be accessed from anywhere by writing
    // BaseClass.DESCRIPTION
    public static string DESCRIPTION = "BaseClass";
}

public class TestClass
{
    public void Test()
    {
        string BaseClassDescription = BaseClass.DESCRIPTION;
    }
}

Я был бы осторожен при использовании терминологии, относящейся к атрибуту. В С# это класс, который может быть применен к другим классам или методам путем "украшения" класса или метода, в другом контексте он может просто ссылаться на поле, которое содержит класс.

// The functionality of this attribute will be documented somewhere
[Test]
public class TestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}

В некоторых языках нет атрибутов, подобных С# (см. выше)

Надеюсь, что все имеет смысл... Не хотите перегружать вас!

Ответ 5

Во-первых, вам нужно выбрать язык. Например, я бы рекомендовал вам выбрать язык Ruby и сообщество. Пока вы не выберете язык, вы не сможете избежать путаницы, поскольку разные сообщества используют разные термины для одних и тех же вещей.

Например, так называемый Module в Ruby, Java знает как абстрактный класс. То, что известно как атрибуты на некоторых языках, известно как instance variables в Ruby. Я рекомендую Ruby специально для своей логичной и хорошо продуманной системы OOP.

Запишите следующее в файле *.rb или в командной строке в irb (интерактивный интерпретатор Ruby):

class Dog                         # <-- Here you define a class representing all dogs.
  def breathe                     # <-- Here you teach your class a method: #breathe
    puts "I'm breathing."
  end

  def speak                       # <-- Here you teach your class another method: #speak
    puts "Bow wow!"
  end
end

Теперь, когда у вас есть класс, вы можете создать его экземпляр:

Seamus = Dog.new

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

Seamus.breathe                   # <-- Invoking #breathe instance method of Seamus
#=> I'm breathing.
Seamus.speak                     # <-- Invoking #speak instance method of Seamus
#=> Bow wow!

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

Итак, чтобы сохранить мир приятным и показать, что ООП очень простой и безболезненный в Ruby, создадим атрибут или, в Ruby terminology, переменную экземпляра класса Dog. Как мы знаем, каждая собака имеет некоторый вес, а разные собаки могут иметь разные веса. Поэтому, создав новую собаку, мы потребуем от пользователя рассказать нам вес собаки:

class Dog
  def initialize( weight )  # <-- Defining initialization method with one argument 'weight'
    @weight = weight        # <-- Setting the dog attribute (instance variable)
  end
  attr_reader :weight       # <-- Making the dog weight attribute visible to the world.
end

Drooly = Dog.new( 16 )      # <-- Weight now must provide weight upon initialization.
Drooly.weight               # <-- Now we can ask Drooly about his weight.
#=> 16

Помните, что с Ruby (или Python) все просто.

Ответ 6

Я обнаружил в мой вопрос, что свойства, определенные в .Net, являются просто удобной синтаксисом для кода, и они вообще не привязаны к базовым переменным (кроме Автореализованные свойства, конечно). Итак, говоря "какая разница между свойством класса и полем класса", вы говорите: в чем разница между методом и атрибутом. Нет разницы, один - код, а другой - данные. И они не должны иметь никакого отношения друг к другу.

Очень жаль, что одни и те же слова, такие как "атрибут" и "свойство", повторно используются на разных языках и идеологиях, чтобы иметь совершенно разные значения. Может быть, кому-то нужно определить объектно-ориентированный язык, чтобы говорить о концепциях в ООП? UML?