Обект (програмиране)

от Уикипедия, свободната енциклопедия
Вижте пояснителната страница за други значения на Обект.

В контекста на обектно ориентираното програмиране обектът се разбира като съвкупност от елементи и тяхното поведение. Софтуерните обекти моделират обекти от реалния свят или абстрактни концепции. Примери за реални обекти са животни, растения, коли, сгради, езера и т.н. Абстрактните обекти са понятия в някоя предметна област, които се налага да моделираме и използваме в компютърна програма. Примери за абстрактни обекти са структурите от данни стек, опашка, списък и дърво.

Пояснение[редактиране | редактиране на кода]

Докато примитивните типове данни са само носители на единични части информация, обектно ориентирани обекти са сложни типове, които имат няколко части информация и специфични свойства или качества. Вместо само да се присвоява стойност (int = 5, double =, decimal =), обектите трябва да бъдат построени (конструирани). Те са в основата на обектно ориентираното програмиране и са най-важните типове данни.

Object – Lion.png
Object – Lion.png

Обектите се използват в разработката на софтуер, като се вграждат абстрактни структури от данни, които обединяват различни компоненти с действията, които ги манипулират. Жизненият цикъл на обектите трае от конструирането им до тяхната деконструкция. Използването на обекта е препоръчително, когато има изискване за изграждане на генерични съчетания, тъй като стойностите на всякакъв вид данни могат да бъдат причислени към променливи от тип обект. Също така те са от ключово значение в концепцията за унаследяването на данни, подобрявайки по този начин надеждността и поддръжката на софтуерната програма.

Обектите се използват предимно при конструирането на „класове“, така се позволява лесен и бърз достъп до информацията заложена в различни „колекции“ (библиотеки), изградени като: Array, List, Queue и т.н., за да бъдат използвани многократно. Всеки обект е представител на точно един клас и е създаден по неговия шаблон.

Създаването на обект от вече дефиниран клас се нарича „инстанциране“ (instantiation). Инстанцията (instance) е реалния обект, който се създава от класа по време на изпълнение на програмата, което означава, че всеки обект е инстанция на конкретен клас. Тази инстанция се характеризира със състояние (state), което представлява множество от стойности, декларирани в елементите на класа.

Характеристики на обектите[редактиране | редактиране на кода]

В обектите могат да се отделят следните три групи характеристики:

  • Състояния (states) – това са характеристики на обекта, които го определят и описват по принцип или в конкретен момент;
  • Поведения (behaviors) – това са специфични характерни действия, които обектът може да извършва;
  • Идентичност (Identity) – уникалност на един обект, която го отличава от други обекти.

Видове обекти[редактиране | редактиране на кода]

Обектите в ООП обединяват данни и средствата за тяхната обработка в едно цяло. Те съответстват на обектите от реалния свят и съдържат в себе си конкретни данни и действия. Характеризират се от два вида:

  • Член-данни (data members) – представляват променливи, вградени в обектите, които описват състоянията им.
  • Методи (methods) – те са инструментът за изграждане на поведението на обектите. Обект, в C #, е пример за клас, който се създава динамично. Обект е също ключова дума, която е псевдоним на предварително определения тип System.Object в. NET Framework.

Обектът се състои от членове инстанция, чиято стойност го прави уникален по подобен набор от обекти.

Когато обектът е инстанция, той се разпределя с блок на паметта и конфигуриран според план, предоставени от този клас, в основата на обекта. Обекти на стойност тип се съхраняват в стека, а тези на референтен тип се разпределят на куп.

Концепцията на „обекта“ и обектно ориентиран подход за програмиране са въведени от езика за програмиране „Simula“, издаден през 1967 г.

В обектно ориентирания подход, данните в даден „обект“ трябва да бъдат достъпни единствено чрез своите „методи / функции“ (подпрограми). Това правило прави лесно редактирането на код и гарантира, че данните винаги ще са лесно и бързо достъпни. Синтактично в почти всички обектно ориентирани езици за програмиране, оператор точка (.) и оператор (поставен между името на обекта и името на полето) се използват, за да се получи достъп до определен „полетата“ на един „обект“.

Създаване и освобождаване на обекти в C#[редактиране | редактиране на кода]

Създаването на обекти от предварително дефинирани класове по време на изпълнението на програмата става чрез оператора new. Новосъздаденият обект обикновено се присвоява на променлива от тип, съвпадащ с класа на обекта. При това присвояване същинският обект не се копира, а в променливата се записва само референция към новосъздадения обект (неговият адрес в паметта). Следва прост пример как става това:

Като пример за обект от реалния свят може да дадем конкретен екземпляр от вида „лъв“. Ако дефинираме основни състояния (свойства) на вида „лъв“ възраст и пол, а основно поведение (функция) – ловуване и „вградим“ тези състояния и поведения в клас „Лъв“, можем да създаваме отделни обекти, които конкретизираме чрез задаване на различни стойности на състоянията и поведението. Т.е. разликата между клас и обект се състои в това, че обектът е конкретен случай (инстанция) на класа. В C# това би изглеждало така:

public class Lion
{
    private int age;
    private string sex;
    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    public string Sex
    {
        get { return sex; }
        set { sex = value; }
    }
    public bool Hunting(int age)
    {
        bool isHunting = true;
        if (age > 10)
        {
            isHunting = false;
        }
        return isHunting;
    }
}

class MyLion
{
    static void Main()
    {
        Lion myLion = new Lion();
        myLion.Age = 2;
        myLion.Sex = "male";
    }
}
Създаване на обект
Създаване на обект

На променливата myLion от тип Lion присвояваме новосъздадена инстанция на класа Lion.
Променливата myLion стои в стека, а нейната стойност (конкретната инстанция на класа Lion)
стои в динамичната памет (managed heap). (вж схемата)

При създаването на обект с оператора new се заделя памет и се извършва начална инициализация на данните му. За да стане това се използва специален метод на класа, наречен конструктор.

Деконструирането (освобождаването) на „обекти“ става възможно чрез вградената в .NET CLR система за почистване на паметта (garbage collector), която се грижи за освобождаването на неизползвани обекти, вместо това да налага ръчно отстраняване. Обектите, които не са нужни, автоматично се унищожават и паметта, която заемат се освобождава. Ръчното премахване на „обект“ става по този начин:

myLion = null;

Това не унищожава обекта, но го оставя в състояние, в което той е недостъпен. При следващото използване на системата за почистване на паметта (garbage collector), той ще бъде изчистен.

Достъп до полетата и свойствата на обекта[редактиране | редактиране на кода]

Достъпът до полетата и свойствата на даден обект става чрез оператора "." (точка), поставен между името на обекта и името на полето (или свойството).

Операторът "." не е необходим, в случай че искаме достъп до поле или свойство на даден клас в тялото на метод от същия клас.

Можем да извличаме или записваме нови данни в полетата и свойствата. В случай на свойство, достъпът се реализира по абсолютно същия начин както и при поле – C# ни предоставя тази възможност. Това се постига чрез двете специални ключови думи get и set в дефиницията на свойството, които извършват съответно извличането на стойността на свойството и присвояването на нова стойност. В дефиницията на класа Lion (която дадохме по-горе) свойства са Age и Sex.

Извикване на методи на обект[редактиране | редактиране на кода]

Извикването на методите на даден обект става чрез оператора „.“ (точка). Операторът точка не е нужен единствено в случай, че методът се вика в друг метод от същия клас.

using System;
namespace Animals
{
    public class Lion
    {
        //...................

        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        //....................

        public static void LionVoice()
        {
            Console.WriteLine("He said: GRRRRRRRAAAUUUU");
        }
    }

    class Program
    {
        static void Main()
        {
            Lion myLion = new Lion();
            myLion.Name = "Leo";

            Console.WriteLine($"The name of my Lion is {myLion.Name}");
            Lion.LionVoice();
        }
    }
}

Ако в нашия клас Lion добавим ново свойство Name и ново поведение (метод) LionVoice(), то можем да зададем име Leo на обекта MyLion чрез myLion.Name = "Leo"; и да извикаме новия метод чрез Lion.LionVoice();. Резултатът ще бъде отпечатан на конзолата:

The name of my Lion is Leo
He said: GRRRRRRRAAAUUUU

Създаване и освобождаване на обекти в PHP[редактиране | редактиране на кода]

<?php
class Lion
{
	public $age;
	public $sex;

	function set_age($inputAge)
	{
		$this -> age = $inputAge;
	}
	function get_age()
	{
		return $this -> age;
	}
	function set_sex($inputSex)
	{
		$this -> sex = $inputSex;
	}
	function get_sex()
	{
		return $this -> sex;
	}
	function Hunting()
	{
		$isHunting = "can";
		if (age > 10)
		{
			$isHunting = "can't";
		}
		return $isHunting;
	}
	function LionVoice()
	{
		return "My lion said: GRRRRRRRAAAUUUU";
	}
}

$myLion = new Lion();
$myLion->set_age(2);
$myLion->set_sex("male");
echo("My ".$myLion->get_age()." years old lion is ".$myLion->get_sex().". My lion ".$myLion->Hunting()." hunt. ".$myLion->LionVoice());
?>

Резултат от кода:

My 2 years old lion is male. My lion can hunt. My lion said: GRRRRRRRAAAUUUU

Създаването на обекти в езика PHP се осъществява чрез ключовата дума new, която създава нова инстанция на класа. Използването на методи на класа става със синтаксиса: „$обект -> функция (параметър);“. Параметрите са нужни само ако функцията изисква такива.

За да се използва конструктор в PHP е нужно името на функцията, която ще се изпълнява при всяко инстанциране да съвпада с името на класа. В примера се използва конструктора Lion, за да се зададат първоначалните стойности за пол и години на новото лъвче.

Във версия PHP 5 не е изцяло довършена концепцията за капсулиране на данните (да се избира дали атрибутите да бъдат достъпни извън класа). Добре е обаче да се използват функции за достъп(setAge и getAge спрямо примерния код), тъй като при премахване или добавяне на някаква нова проверка за валидността на данните подавани към този атрибут се налага промяна единствено във функциите за достъп до този атрибут.

За освобождаването на паметта в PHP от ненужните обекти и променливи се грижи garbage collector, който открива автоматично всички ресурси към които вече няма референции (не се използват).

Използвана литература[редактиране | редактиране на кода]

Сродни статии[редактиране | редактиране на кода]

Външни препратки[редактиране | редактиране на кода]