Да върнеш Object или Array

dakata__92

Super Moderator
Здравейте Колеги,

В тази тема желая да Ви попитам за личното Ви отношение към връщаните от разни функции и методи стойности. С кое обичате да работите повече, като върнат резултат от даден метод/функция, обект или масив?

PHP:
function x ()
{
	return array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
}

function x2 ()
{
	return (object)["Peter"=>"35", "Ben"=>"37", "Joe"=>"43"];
}

Напоследък доста коментираме този въпрос с приятели и ми е интересна и вашата гледна точка. Много зависи от случая, но по-често връщам масиви вместо обекти. В един проект пък ми се наложи доста обекти да връщам, като резултат и ми се струва, че кода става по-чист, но пък за сметка на това обсъждаме и това, че ако се връщат повече обекти вместо масиви пиковото използване на паметта се покачва. Вие какво мислите по казуса?
 
Ако видя такова нещо в код, директно уволнявам.

Масива трябва да си остане масив. Работата с масив е много по-лесна и разбираема. Когато работиш с обект(конвертиран масив) нещата могат да се оплескат жестоко и става страшно объркващо.

Обект се връща, ако е само инстанция на друг клас и искаш да работиш с методите му.

Можеш да върнеш масив от обекти, но не да конвертираш масив в обект. Просто трябва да си избиеш това нещо от главата.
 
Revelation каза:
Ако видя такова нещо в код, директно уволнявам.

Масива трябва да си остане масив. Работата с масив е много по-лесна и разбираема. Когато работиш с обект(конвертиран масив) нещата могат да се оплескат жестоко и става страшно объркващо.

Обект се връща, ако е само инстанция на друг клас и искаш да работиш с методите му.

Можеш да върнеш масив от обекти, но не да конвертираш масив в обект. Просто трябва да си избиеш това нещо от главата.

Наистина е така и подкрепям мнението ти. Аз също смятам, че масива е по-лесен за обработка, но в много проекти виждам как са използвали stdClass, като връщан резултат и съм принуден да следвам тази омазия, като логика. Интересно ми е защо се прави така? Да кода изглежда с една идея по-добре четим след това, но не мога да го приема, като практика. Непонятна ми е логиката в изплюването на обект след обект от методи.
 
Според мен проблемът тук идва оттам, че в PHP разликата в синтаксиса между обект/масив/hashmap е много малка, и много лесно превръщаш едното в другото, като вторите две дори съвпадат.

hashmap/масив е data structure - 'структура от данни', в математическия смисъл на 'релация' и 'редица'. Тоест това е място - контейнер с динамичен размер, в който слагаш и махаш неща.

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

Шаблонът, или 'структурата' на един обект е ясна още по време на компилация - в случая, преди да се интерпретира кодът.

Може би PHP синтаксисът ти пречи да различаваш семантиката на двете (смисълът 'отзад'), защото преобразуването между двете е тривиално.

Използвай функционалностите на езика според предвидените им семантики, защото това е уговорка, която спазваш с останалите - и ако ти имаш предвид обект, а ползваш PHP'ския array, или обратното, ще стане мазало - най-малкото ще объркаш човека.
 
anonimen каза:
Според мен проблемът тук идва оттам, че в PHP разликата в синтаксиса между обект/масив/hashmap е много малка, и много лесно превръщаш едното в другото, като вторите две дори съвпадат.

hashmap/масив е data structure - 'структура от данни', в математическия смисъл на 'релация' и 'редица'. Тоест това е място - контейнер с динамичен размер, в който слагаш и махаш неща.

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

Шаблонът, или 'структурата' на един обект е ясна още по време на компилация - в случая, преди да се интерпретира кодът.

Може би PHP синтаксисът ти пречи да различаваш семантиката на двете (смисълът 'отзад'), защото преобразуването между двете е тривиално.

Използвай функционалностите на езика според предвидените им семантики, защото това е уговорка, която спазваш с останалите - и ако ти имаш предвид обект, а ползваш PHP'ския array, или обратното, ще стане мазало - най-малкото ще объркаш човека.

Разбирам разликите и преобразуването, но продължавам да не разбирам, защо някои програмисти изплюват от своите методи обекти вместо масив? С какво им е по-удобно да работят с обект вместо с масив и то в по-голям проект? Няма да споменавам имена или фракции от системата, ама масово в този проект се използваше тази практика и то от реномирана фирма. От там и с приятелите ми повдигнахме темата и всякакви доводи в + и - дадохме, но реално не си отговорихме с кое им е по-удобно да изплюват от някои методи - обекти.
 
Хората, които кастват масив към обект, са същите хора, които си мислят, че пишат ООП, само защото са написали 10 функции wrap-нати в един клас.

За панделка са в неймспейс.

Ама аз не бих уволнила човека, а по-скоро бих му показала/обяснила/убедила защо да не се прави така. :)

Ако споделиш кода, където си го видял, може да има друго обясниение/предназначение.

Може да е от JSON*, който е decode-нат, без втория аргумент (който форсва ползването на асоциативен масив), та за това е някакъв "обект".


Ако е директно (object)['pesho'=>31], рип за програмистчету. :cry:

*JSON as in JavaScript Object Notation, да не се бърка със холивудската звезда:

json-statham-meanwhile-43281635.png


ПС: Тема за есе: "Живота и творчеството на един PHP Обект",

Код:
$x = new __PHP_Incomplete_Class;
var_dump(gettype($x)); // string(6) "object"
var_dump(is_object($x)); // bool(false)
 
Fakeheal каза:
Хората, които кастват масив към обект, са същите хора, които си мислят, че пишат ООП, само защото са написали 10 функции wrap-нати в един клас.

За панделка са в неймспейс.

Ама аз не бих уволнила човека, а по-скоро бих му показала/обяснила защо да не се прави така. :)

Ако споделиш кода, където си го видял, може да има друго обясниение/предназначение.

Може да е от JSON*, който е decode-нат, без втория аргумент (който форсва ползването на асоциативен масив), та за това е някакъв масив.

Ако е директно (object)['pesho'=>31], рип за програмистчету. :cry:

JSON, да не се бърка със холивудската звезда:

json-statham-meanwhile-43281635.png

Не мога да постна от кода, по ред независещи от мен причини, но нямаше никакво ОЧЕВАДЕЩО налагане на такъв тип връщане. Впрочем само за примера сложих (object) масив, а в системата бяха си поиграли да използват new stdClass, което правеше същото, като моя пример (ама по-сложно). Да си кажа честно умувам и не достигам до разумен отговор. Лошото е, че екип от програмисти е създал това творческо произведение.
 
Fakeheal каза:
Ама аз не бих уволнила човека, а по-скоро бих му показала/обяснила/убедила защо да не се прави така. :)

Във фирмата, която работя имаме същите изпълнения. За жалост не мога да налея акъл на човека, който е писал системата преди време, но с радост бих му забил няколко шамара. :D
 
Ако се плюват обекти вместо масиви само защото виждаш ли е ООП структура за работа с резултата, то логиката на някой е строго разрушена. Умувахме с приятели и не достигаме до нормален отговор. Жалко, че не мога да Ви споделя от кода. Красиво се е получил, но е тежък и системата бави. Най-просто казано трябва да се пренаписва....
 

Горе