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 4482 Точки

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

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

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

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

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

1
dim4o avatar dim4o 288 Точки

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

1. Geometry-PseudoClassical-Inheritance

2. Geometry-Prototype-Inheritance

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

2
Filkolev avatar Filkolev 4482 Точки

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

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

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

0
dim4o avatar dim4o 288 Точки

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

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

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

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

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

0
dim4o avatar dim4o 288 Точки

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

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

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

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

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

0
yuletodim avatar yuletodim 37 Точки

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

        Point.prototype.toString = function () {
            return this.constructor.name + "(" + this.getX() + ", " + this.getY() + ")";
        };
 
Успех!
1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.