Показаны сообщения с ярлыком ООП. Показать все сообщения
Показаны сообщения с ярлыком ООП. Показать все сообщения

вторник, 11 августа 2009 г.

Следование стандартам...

Так сложилось, что вот уже несколько месяцев занимаюсь программированием на PHP, пишу свои классы и модули, попутно ковыряя чужие, верстаю и т.д. и т.п. И за всё это время я не видил НИ ОДНОГО продукта (естественно опенсорс) полностью соответствующего стандартам W3C и парадигмам ООП. Интересно, почему разработчики столь наплевательски относятся к стандартам, по сути писавшимся для них, дабы облегчить их нелёгкий труд?

С ООП всё, более или менее, понятно. PHP изначально был процедурным языком и ни о каком ООП в нём речи не шло. Да и сейчас в версии 5.1 часть парадигм ООП не полностью поддерживается или поддерживается с помощью всевозможных "костылей" выдаваемых за преимущества PHP.
Например в PHP нет т.н. акцессоров и мутаторов, точнее они "как бы" есть, предлагается пользоваться следующей конструкцией:
<?php
class MyClass {
private $properties;
function __set($name, $value) {
echo "задание нового свойства $name = $value";
$this->properties[$name]=$value;
}
function __get($name) {
echo "чтение значения свойства ", $name;
return $this->properties[$name];
}
}
$obj = new MyClass;
$obj->property = 1; // Выводит "задание нового свойства property=1"
$a = $obj->property; // Выводит "чтение значения свойства property"
echo $a; // выводит 1;
?>

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

А вот со стандартами косорциума W3C всё не так просто. По какой то не ведомой мне причине практически все разработчики плюют на эти стандарты и воротят ТАКОЕ, что хватаешься за голову.
Вроде бы HTML все в школе/техникуме/институте изучают, да и W3C на месте не сидит, создавая для разработчиков всякие валидаторы, обнаруживающие ошибки в гипертексте странички и подробно разбирая каждую в соответствии со стандартом. В инете полно русско-язычных (и не только русско) ресурсов с подробным объяснением всех этих стандартов. И тем не менее разработчики продолжают испытывать браузеры на прочность своим бредом в гипертексте и жабаскрипте. Просто ради интереса зайдите вот сюда -> http://validator.w3.org/check?uri=http%3A%2F%2Fwww.lastfm.ru%2F&charset=%28detect+automatically%29&doctype=Inline&group=0&user-agent=W3C_Validator%2F1.654 и обалдейте от количества ошибок и варнингов найденных валидатором в коде странички (страничка подвернулась случайно, просто этот сайт упорно отказывается у меня работать под оперой уже в течении двух его версий).
А вот и тест любимого ВКонтакта -> http://validator.w3.org/check?uri=http%3A%2F%2Fvkontakte.ru&charset=%28detect+automatically%29&doctype=Inline&group=0
Причём заметьте, и тот и другой -- являются коммерческими проектами. Про не коммерческий код я вообще молчу...

среда, 8 апреля 2009 г.

Классы, их наследование и объекты "на пальцах"

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

Итак, что же такое классы и их наследники и чем они отличаются от объектов.

Возьмём, к примеру, класс Стол. Этот класс обладает свойствами: Длина, Ширина, Высота. И имеет метод, например: Стоять.
У класса Стол есть наследники (дочерние классы). Например, класс ПисьменныйСтол и КомпьютерныйСтол. Эти классы наследуют от родительского класса Стол все его свойства (Длина, Ширина, Высота) и методы (Стоять), но класс ПисьменныйСтол, по мимо унаследованных от родительского класса Стол свойств и методов, может иметь дополнительное своство КоличествоЯщиков и метод ВыдвинутьЯщик. Также и класс КомпьютерныйСтол может иметь свойство КоличествоСекцийДляCD и метод ВыдвинутьСтолешницу.
Стол
, КомпьютерныйСтол и ПисьменныйСтол -- это классы.
Почему?
Потому что это некоторые сущности, которые описывают некий набор свойств и поведений характерных для всех столов (класс Стол) или только для компьютерных столов (класс КомпьютерныйСтол) или только для письменных столов (класс ПисьменныйСтол).
Но тогда что же такое объект?
Объект -- это стол за которым ты сейчас сидишь (причём скорее всего это объект класса КомпьютерныйСтол). Объект -- это (в большинстве случаев) экземпляр некоторого класса. Также как твой компьютерный стол является экземпляром класса КомпьютерныйСтол.

Перенося всё это в PHP код получим:

<?php

/**
* Стол
*/
class Table {
/**
* Длина стола
* @var float
*/
public Length;

/**
* Ширина стола
* @var float
*/
public Width;

/**
* Высота стола
* @var float
*/
public Height;

/**
* Осуществляет стояние стола
*/
public function Stand() {

}
}

/**
* КомпьютерныйСтол
*/
class ComputerTable extends Table {
/**
* Количество секций для CD
* @var int
*/
public CDSectionsCount;

/**
* Выдвигает столешницу с клавиатурой
*/
public function MoveOutTabletop() {

}
}

/**
* ПисьменныйСтол
*/
class Desk extends Table {
/**
* Количество ящиков
* @var int
*/
public DeskDrawerCount

/**
* Выдвигает ящик с указанным номером
* @param int $DeskDrawerNumber Номер выдвигаемого ящика
*/
public function MoveOutDeskDrawer($DeskDrawerNumber) {

}
}

$MyTable = new Table(); // а вот $MyTable -- это уже объект класса Table
$MyTable->Width = 1;
$MyTable->Height = 0.7;
$MyTable->Length = 3;

$MyComputerTable = new ComputerTable(); // $MyComputerTable -- тоже объект
$MyComputerTable->Width = 0.8; // и так как класс ComputerTable является
$MyComputerTable->Height = 0.7; // наследником класса Table, то он имеет
$MyComputerTable->Length = 0.5; // все теже свойства что и объект $MyTable
$MyComputerTable->CDSectionsCount = 5; // плюс новое свойство CDSectionsCount

$MyComputerTable->Stand(); // Аналогично свойствам наследуются и методы
$MyComputerTable->MoveOutTabletop();

?>


P.S.: PHP -- не лучший выбор для начала освоениея ООП, но сейчас я пишу в основном на нём.