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

C++ JAVA
Post Reply
User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3302
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

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

Post by dakata__92 » Thu Mar 07, 2019 6:08 pm

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

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

[php]
function x ()
{
return array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
}

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

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

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 891
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 63

Post by Revelation » Thu Mar 07, 2019 6:33 pm

Ако видя такова нещо в код, директно уволнявам.

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

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

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

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3302
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Thu Mar 07, 2019 6:46 pm

Revelation wrote:Ако видя такова нещо в код, директно уволнявам.

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

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

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

User avatar
anonimen
Web-tourist
Web-tourist
Posts: 1589
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 163
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Thu Mar 07, 2019 6:51 pm

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

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

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

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

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

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

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3302
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Thu Mar 07, 2019 7:00 pm

anonimen wrote:Според мен проблемът тук идва оттам, че в PHP разликата в синтаксиса между обект/масив/hashmap е много малка, и много лесно превръщаш едното в другото, като вторите две дори съвпадат.

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

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

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

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

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

Fakeheal
Гуру
Гуру
Posts: 2706
Joined: Sat Apr 17, 2010 6:37 am
Answers: 351
Location: /r/eyebleach
Contact:

Post by Fakeheal » Thu Mar 07, 2019 7:06 pm

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

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

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

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

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


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

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

Image

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

Code: Select all

$x = new __PHP_Incomplete_Class;
var_dump(gettype($x)); // string(6) "object"
var_dump(is_object($x)); // bool(false)

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3302
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Thu Mar 07, 2019 7:15 pm

Fakeheal wrote:Хората, които кастват масив към обект, са същите хора, които си мислят, че пишат ООП, само защото са написали 10 функции wrap-нати в един клас.

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

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

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

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

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

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

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

User avatar
Revelation
Web-tourist
Web-tourist
Posts: 891
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 63

Post by Revelation » Fri Mar 08, 2019 7:30 pm

Fakeheal wrote: Ама аз не бих уволнила човека, а по-скоро бих му показала/обяснила/убедила защо да не се прави така. :)
Във фирмата, която работя имаме същите изпълнения. За жалост не мога да налея акъл на човека, който е писал системата преди време, но с радост бих му забил няколко шамара. :D

User avatar
dakata__92
Web-tourist
Web-tourist
Posts: 3302
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 126

Post by dakata__92 » Sun Mar 10, 2019 7:14 am

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

Post Reply