ААП тэрміналогія: клас, атрыбут, ўласцівасць, поле, элемент дадзеных

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

Я паглядзеў на С ++ клас, клас Java, і я хачу ведаць дастаткова, каб напісаць свой уласны клас псеўда, каб дапамагчы мне зразумець.

Напрыклад, у гэтага артыкула я прачытаў гэта (.. атрыбут класа (або клас ўласцівасць, поле, або член дадзеных)

I have seen rather well cut out questions that show that there is a difference between class property and class field for instance What is the difference between a Field and a Property in C#?

У залежнасці ад таго, якую мову я вывучаю, з'яўляецца вызначэнне

  • Уласцівасць
  • Палі
  • <�Літый> Зменныя класа
  • Уласцівасці

адрозніваецца ад мовы да мовы?

14

6 адказы

«Поле», «пераменны клас», і «атрыбуты» з'яўляецца больш ці менш тое ж самае - нізкі ўзровень слот для захоўвання прымацаваны да аб'екта. Дакументацыя кожнай мовы можа выкарыстоўваць іншы тэрмін паслядоўна, але большасць рэальных праграмістаў выкарыстоўваюць іх як узаемазаменныя. (Тым не менш, гэта таксама азначае, што некаторыя з тэрмінаў могуць быць неадназначнымі, як «клас пераменны» - які можа быць інтэрпрэтаваны як «пераменны асобнік дадзенага класа», або «пераменная сам аб'ект класа» ў мове дзе аб'екты класа з'яўляюцца чымсьці вы можаце кіраваць непасрэдна.)

«Уласцівасці», у большасці моў, якія я выкарыстоўваю, нешта зусім іншае - яны спосаб прымацаваць карыстацкае паводзіны чытання/запісы поля. (Або замяніць яго.)

Такім чынам, у 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() - ці проста геттер, калі ўласцівасць толькі для чытання.)


Іншы спосаб глядзець на гэта, што «ўласцівасці» з'яўляюцца абстракцыя - гэта абяцанне аб'екта, каб дазволіць абанентам атрымаць ці ўсталяваць частку дадзеных. У той час як «поле» і г.д. з'яўляецца адным з магчымых рэалізацыя гэтай абстракцыі. Значэння getRadius() або getCircumference() у прыведзеным вышэй прыкладзе можна захоўваць непасрэдна, ці ж яны могуць быць вылічаныя, гэта не мае значэння для выклікае абанента; сетары могуць або не могуць мець пабочныя эфекты; гэта не мае значэння для выклікалага боку.

15
дададзена
@delnan дадаў, што ў неадназначнасці, верагодна, перасцярога для любога мовы з тыпамі як аб'екты першага класа. ( «Тыпы з'яўляюцца аб'ектамі першага класа» таксама, верагодна, найбольш заблытанай магчыма прапанову, каб растлумачыць да ООП пачаткоўцу.)
дададзена аўтар millimoose, крыніца
Адно выключэнне: У Python, «пераменная класа» ставіцца да члену класа аб'екта (які іншыя мовы называюць статычнай зменнай/членам/поле).
дададзена аўтар delnan, крыніца

Я рабіў полокоть на працягу больш за 20 гадоў, і я лічу, што людзі часта выкарыстоўваюць розныя словы для адных і тых жа рэчаў. Я разумею, што палі, зменныя класа і ўсе атрыбуты азначаюць тое ж самае. Аднак ўласцівасць лепш за ўсё апісваецца StackOverflow спасылку , што вы ўключылі ў сваё пытанне.

2
дададзена

Эй Ці ведаеце вы Nothing Джон Сноў,

I agree with you, there's a lot of unnecessary confusion due to the loose definitions and inconsistent use of many OO terms. The terms you're asking about are used somewhat interchangeably, but one could say some are more general than others (descending order): Property -> Attributes -> Class Variables -> Fields.

Наступныя урыўкі, вынятыя з <�моцны> «аб'ектна-арыентаваны аналіз і праектаванне" </моцны> па Град Буч дапамагаюць растлумачыць прадмет. Па-першае, важна зразумець канцэпцыю дзяржавы:

<�Р> <�моцны> стан </моцны> аб'екта ахоплівае ўсе (звычайна статычных) уласцівасцяў аб'екта плюс току (звычайна дынамічнымі) значэннямі кожнага з гэтых уласцівасцяў . Па ўласцівасцях, мы маем на ўвазе сукупнасць атрыбутаў аб'екта і адносін з іншымі аб'ектамі.

ААП з'яўляецца даволі агульным адносна пэўнай наменклатуры, так як яна змяняецца дзіка ад мовы:

<�Р> Тэрміны <�моцны> поле </моцны> (Object Pascal), <�моцны> асобнік зменнай </моцны> (Smalltalk), аб'ект членам (C ++), і слот (CLOS) з'яўляюцца ўзаемазаменнымі , то ёсць сховішча для часткі стану аб'екта. У сукупнасці яны ўтвараюць структуру аб'екта.

Але абазначэння, уведзеныя аўтарам з'яўляецца дакладным:

<�Р> Элемент <�моцны> атрыбут </моцны> пазначае частка сукупнага аб'екта, і таму выкарыстоўваецца падчас аналізу, а таксама праектавання да выказаць асаблівую ўласцівасць класа . Выкарыстоўваючы незалежны ад мовы сінтаксіс, атрыбут можа мець імя, клас, або абодва, і, магчыма, выраз па змаўчанні: А :. З = Е </р>      

<�моцны> Клас зменнай: Частка стану класа . Калектыўна, класавыя зменныя класа складаюць яго структуру. Невялікі класа з'яўляецца агульным для ўсіх экзэмпляраў аднаго і таго ж класа. У C ++ пераменная класа праяўляецца ў форме статычны член. </Р>

У выніку:

  • <�моцны> Уласцівасць з'яўляецца шырокае паняцце, якое выкарыстоўваецца для абазначэння пэўнай характарыстыкі класа , ахопліваючы як яго атрыбуты і яго адносіны да іншых класаў.

  • <�Літый> <�р> <�моцны> Навык </моцны> пазначае частка сукупнага аб'екта , і таму выкарыстоўваюцца падчас аналізу, а таксама канструкцыі, каб выказаць асаблівую ўласцівасць класа. </р>
  • <�моцны> Клас пераменная з'яўляецца атрыбут, пэўны ў класе якога існуе , незалежна ад таго, колькі асобнікаў класа існуюць у адзіным экземпляры. Такім чынам, усе асобнікі гэтага класа доля яго кошту, а таксама яго заяву.

  • <�Літый> <�р> <�моцнае> Поле </моцны> гэта тэрмін для канкрэтнага мовы для пераменная асобніка, то ёсць атрыбут, значэнне якога з'яўляецца спецыфічным для кожнага аб'екта . </Р>

ура

2
дададзена

Па-першае, вам трэба выбраць мову. Напрыклад, я б рэкамендаваў вам выбраць мову Ruby, і супольнасць. Да таго часу, пакуль не будзе абраны мова, вы не можаце пазбегнуць блытаніны, так як розныя супольнасці выкарыстоўваюць розныя тэрміны для адных і тых жа рэчаў.

Напрыклад, тое, што вядома як Модуль у Ruby, Java ведае, як абстрактны клас . Што называецца атрыбуты у некаторых мовах, вядомы як зменныя асобніка у Ruby. Я рэкамендую Рубі асабліва для лагічнай і добра распрацаванай сістэмы ААП.

Напішыце наступнае ў .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.breathe                   # <-- Invoking #breathe instance method of Seamus
#=> I'm breathing.
Seamus.speak                     # <-- Invoking #speak instance method of Seamus
#=> Bow wow!

Што тычыцца пакінутых пытанняў тэрміналогіі, «ўласцівасць» або «атрыбут» разумеецца як «пераменная» у Ruby, амаль заўсёды <�ем> асобнік зменнай . А што тычыцца «члена дадзеных» тэрміна, проста забыцца пра гэта. «Поле» тэрмін на самай справе не выкарыстоўваецца ў Ruby, і «пераменная класа» ў Рубіне азначае нешта вельмі рэдка выкарыстоўваецца, што вы дакладна не павінны ведаць, на дадзены момант.

Так, каб утрымаць свет прыгожа і паказаць вам, што ААП з'яўляецца вельмі просты і бязбольны ў Ruby, давайце створым атрыбут, або, у тэрміналогіі Ruby, зменнай асобніка Dog класа. Як вядома, кожная сабака мае некаторы вага, і розныя сабакі могуць мець розную вагу. Такім чынам, пры стварэнні новай сабакі, мы будзем патрабаваць ад карыстальніка, каб паведаміць нам вага сабакі:

class Dog
  def initialize( weight )  # <-- Defining initialization method with one argument 'weight'
    @weight = weight        # <-- Setting the dog's attribute (instance variable)
  end
  attr_reader :weight       # <-- Making the dog's 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

Памятаеце, што з Рубінам (або Python), усё проста.

1
дададзена
Любая праблема з маімі прыкладамі?
дададзена аўтар Boris Stitnicky, крыніца

Як правіла, поля, метады, статычныя метады, ўласцівасці, атрыбуты і клас (або статычныя зменныя) не змяняюцца на аснове мовы ... Хоць сінтаксіс, верагодна, зменіцца на на базе мовы, яны будуць функцыі так, як можна было б чакаць па мовах (чакаем такія тэрміны, як поля/элементы дадзеных, якія будуць выкарыстоўвацца як узаемазаменныя па мовах)

У C# ....

Поле ўяўляе сабой зменную, якая існуе для дадзенага асобніка класа.

напрыклад.

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;
        }
    }
}

Поля маюць «бачнасць» гэта вызначае, якія іншыя класы могуць бачыць поле, так што ў прыведзеным вышэй прыкладзе прыватнае поле можа выкарыстоўвацца толькі класам, які яго ўтрымлівае, але ўласцівасць аксессор прадастаўляе доступ толькі для чытання да поля з дапамогай падкласаў.

Ўласцівасць дазваляе атрымаць (часам званы збруя) або ўсталяваць (часам званы мутатором) значэнне поля ... Уласцівасці дазваляюць зрабіць некалькі рэчаў, прадухіліць напісанне поля, напрыклад з-за межы класа, змяніць бачнасць поле (напрыклад, прыватны/абаронены/грамадскасці). Мутатор дазваляе забяспечыць некаторую ўласную логіку перад устаноўкай значэння поля

Такім чынам, ўласцівасці больш падобна на метады, каб атрымаць/ўсталяваць значэнне поля, але забяспечвае вялікую функцыянальнасць

напрыклад.

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's 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");
            }
        }
    }
}

A class or static variable is a variable which is the same for all instances of a class.. So, for example, if you wanted a description for a class that description would be the same for all instance of the class and could be accessed by using the class напрыклад.

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;
    }
}

Я б быць асцярожным пры выкарыстанні тэрміналогіі, якія адносяцца да атрыбуту. У C# гэта клас, які можа быць ужыты да іншых класаў або метады, з дапамогай «ўпрыгожвае» класа або метады, у іншых кантэкстных й яна можа проста спаслацца на поле, што клас ўтрымлівае.

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

У некаторых мовах не маюць «атрыбуты», як C# не мае (гл вышэй)

Будзем спадзявацца, што ўсё гэта мае сэнс ... Не хачу перагружаць вас!

1
дададзена

Я знайшоў у маё пытанне , што ўласцівасці, як вызначана ў .NET толькі зручнасць сінтаксіс кода, і яны не прывязаныя да базавых пераменным наогул (для аўтаматычнага Рэалізавана уласцівасцяў за выключэннем, вядома). Так, кажучы: «У чым розніца паміж класам уласнасцю і полем класа», як кажуць: у чым розніца паміж метадам і атрыбутам. Няма розніцы, адзін не код, а другі дадзеныя. І яны не павінны мець нічога агульнага адзін з адным.

Гэта сапраўды вельмі дрэнна, што адзін і тое ж слова, як «атрыбут» і «ўласцівасць», паўторна выкарыстоўваецца на розных мовах і ідэалогіях мець рэзка розныя значэнні. Можа быць, каму-то трэба вызначыць, аб'ектна-арыентаваны мова , каб гаварыць пра паняцці ў ООП? UML?

0
дададзена