Професионална програма
Loading...
velio84 avatar velio84 241 Точки

[Homework] Advanced JS - Prototype Chain and Inheritance

Имам проблем с 2-ра задача.

Ето го кода

Проблема ми е във функцията за създаване на сегмент (редове 95-104).

Тъй като линията и сегмента имат еднакви пропъртита (A[x,y], B[x,y], color) - искам сегмента просто да наследи линията.

Като го мина през дебъгера, излиза че проблема е когато тръгна да създавам init на segment (97 ред), програмата отива в конструктора на line (базовия клас за segment, ред 80) и там зацикля с

"too much recursion" в браузъра и

"RangeError: Maximum call stack size exceeded" в nodejs

laughing

струва ми се, че проблема е някъде в this-овете, но не съм сигурен...

Някакви идеи? :)

2
JavaScript Advanced 13/03/2015 02:35:44
Filkolev avatar Filkolev 4486 Точки

Ето моите решения на двете задължителни задачи: ЛИНК.

За съжаление няма да имам време да направя другите две, тия дни тичам напред-назад и се занимавам с глупости...

Имам няколко въпроса.

  • По 1-ва задача, реших да сложа някакви валидации (на 2-ра ги пропускам, не ми се занимава пак да ги правя). Направих ги обикновени функции, не исках да слагам някакви изчанчени пропъртита. Това обаче означава, че трябва да подавам като аргумент и самия обект, за да мога да му сетна стойността. Някой може ли да предложи по-кадърен начин да го направя това?
  • Реших, че отсечката трябва да ми наследява правата, за да се спести повторение на малко код (те двете са еднакви по дефиницията на условието). Обаче във 2-ра задача стигам до прекрасния ред: result += this._super._super.toString() - бъркам два пъти навътре в _super, за да стигна toString на shape.
  • Като цяло в shape/Shape имам само color. Ако правих задачата на C# бих направил клас точка и за всяка фигура да има списък от точки, но в случая за всяка конкретна фигура задавам директно координатите. Някой да го е направил с клас точка и масив от точки? Видях варианти, в които фигурата има някакви координати, но не ми се струва много чисто.

Други препоръки са добре дошли.

1
dim4o avatar dim4o 289 Точки

Аз го направих с точка и двете. Така ми се стори по-логично. И аз реших че е по-добре триъгълника да наследи правата. Shape има point и color, защото това е общото между всички обекти. Така има градация: точка -> отсечка->затворен полигон. Ето ги двете задачи:

1. Geometry-PseudoClassical-Inheritance

2. Geometry-Prototype-Inheritance

С гетъри, сетъри и валидации стават 200 реда код. Освен това изглежда грозно, а логиката - трудна за проследяване. Но какво да се прави...

2
Filkolev avatar Filkolev 4486 Точки

Това, че всички фигури имат поне по една точка - така е, но излиза, че едната точка от триъгълника се счита за базова, а другите - някакви допълнителни, което не е много ясно като логика. По принцип с геометричните фигури са доста объркани нещата на моменти и трябва много да се внимава с наследяването.

Триъгълника да наследява правата не мисля, че е правилно, триъгълника не е вид права.

Иначе че излиза дълго - еми като сме свикнали да валидираме няма начин...

0
dim4o avatar dim4o 289 Точки

Според мен пък е доста логично. Фигурата с N точки наследява фигурата с N-1 точки, както отсечката наследява точката. Така новия конструктор има да добави само една точка. Триъгълника не е вид права но и правата не е вид точка. Или е - все е тая. Тези абстракции си ги правим да си услесним писането и има много модели - някои са по-интуитивни, а други не.

0
21/03/2015 00:12:49
Filkolev avatar Filkolev 4486 Точки

Наследяването е връзка "is a", така че триъгълникът няма как да наследява правата или правата точката, просто не е коректно ООП.

Наследяването е моделиране на реалния свят и не е редно да се прави само за удобство и да се спести малко код; излиза, че може да дефинираме триъгълник, след това четириъгълник, който го наследява, понеже добавя само още една точка, след това петоъгълник, който добавя още една и т.н. Може да е удобно, но не е правилно. 

Т.е. не мога да се съглася с твърдението ти, че "Тези абстракции си ги правим да си услесним писането". Това, че си улесняваме писането е страничен ефект на пренасянето на взаимовръзки от реалния свят в света на програмирането чрез принципите на ООП, което ни позволява да не повтаряме общите характеристики на свързани обекти.

0
dim4o avatar dim4o 289 Точки

Според мен е много удобно от ООП гледна точка и освен това е математически коректно. Пестенето на писане в случая е страничен ефект(както каза). Нали точно това е абстракция. Ако фигурите на този свят бяха само 4-5 -разбирам. В крайна сметка геометрията тук е на ниво 3-ти клас. А как се конструира полигосн с 257 ъгли? Правим си клас със 257 properties? Странно е. За какво ни е тогава наследяването.

ПП: Реалния свят не е в крайна сметка само това което виждаме. Ако програмирането трябва да описва просто някакви неща би било много жалко. Геометрията от гледна точка на Теория на групите например е нещо съвсем различно от това което си представят повечето хора. Но това си е мое мение. Няма повече да задълбочавам.

0
21/03/2015 01:00:01
Filkolev avatar Filkolev 4486 Точки

Правилният начин е да имаме абстрактна фигура (полигон), която има списък с точки. Всяка конкретна фигура си знае колко точки ще има в този списък и какво друго да добави.

Пак казвам, наследяването при геометрията е трудно да се измисли - дали отсечката е вид права, дали елипсата е вид окръжност или окръжността вид елипса и т.н. Има варианти. Но не е правилно нито от ООП гледна точка, нито от математическа триъгълника да наследява правата или петоъгълника да наследява четириъгълника. Не вярвам който и да е от по-опитните колеги да не се съгласи в това отношение.

0
yuletodim avatar yuletodim 37 Точки

Здравей! Смятам, че твоя код е най-правилен и абстрактен, най-много се доближава до кода от последния изпит - валидации, сетъри, гетъри. Вместо да пишеш имената на фигурите в метода toString можеш да ползваш this.constructor.name - това ще ти изведе името на фигурата:

        Point.prototype.toString = function () {
            return this.constructor.name + "(" + this.getX() + ", " + this.getY() + ")";
        };
 
Успех!
1