Loading...
Kibork avatar Kibork 87 Точки

[Homework] JS OOP - Object Oriented Programming

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

Ето моите варянти на задачите. Приемам всякакви критики и забележки.

1. Shapes:

    - Shapes.js

    - Shapes.html

2. Canvas Geometry API:

    - Shapes.js

    - CanvasGeometryAPI.js

    - MovingShapes.js

    - RemovingShape.js

    - ZindexRedrawing.js

    - CanvasGeometryAPI.html

    - CanvasGeometryAPI.css

 

Поздрави,

 

Димитър!

21
JavaScript Advanced 10/12/2014 00:41:57
presian avatar presian 223 Точки

Не съм много сигурен, но мисля, че не си напраил правилно налседяването. ти реално сякаш правиш вътрешни за Shape класове от останалите фигури. Аз сега го мъча, но мисля че трябва да е нещо такова (не съм си изяснил съвсем нещата, затова само като предложение го давам):

Mod Edit: Нарушена т. 12 от Правилата на форума: Във всеки пост е позволено цитирането на не повече от 15 реда код. Ако искате да споделите по-дълъг код, използвайте сайтове като Pastebin и Github Gist). 

Всъшност не съм сигурен дали трябва да има изобщо цвят в Point при положение че това са просто координати, но по условие трябва да наследи Shape и всички наследници трябва да имат цват.

0
04/11/2014 15:39:30
Ventsislav avatar Ventsislav 343 Точки

Колега ползвай github или pastebin така кода изглежда доста нечетим ...

4
Kibork avatar Kibork 87 Точки

presian, както казва колегата Ventsislav, добре ще е да не пишеш кода така директно, а да позваш github или pastebin.

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

 

Поздрави,

 

Димитър!

-1
ttitto avatar ttitto 1153 Точки

Всъщност фигурите са много добре направени, и наследяването си е точно както трябва да бъде. Това със сериализирането не ми беше хрумнало. Май е добра идея. Интересно ми е как ще го използваш във втората задача.

2
ZvetanIG avatar ZvetanIG 907 Точки

Много интересна задача, но става мазало с кода. Имам следния въпрос и ако някой знае ще се радвам да ми отговори.

Има ли начин и тук всеки "клас"  да се слага в отделен файл. Тогава нещата ще са много по-прегледни.

 

След няколкочасова забава ето и моето домашно.

1. Демо - Код

 

P.S.  Употребявай разумно. Преписването е вредно за вашето обучение. 

17
02/11/2014 21:11:26
ttitto avatar ttitto 1153 Точки

По условие всяка фигурка трябва да си има свой метод draw(), който да я изчертава. Просто апито ти трябва да знае кои са всичките фигурки в момента и да знае къде да ги начертае. И когато трябва да ги чертае е достатъчно само да мине през всяка фигурка и да и каже "Ето ти този канвас, начертай се на него". 

Иначе евала, че си се справил само за няколко часа. Аз тази домашна я писах три дни по 4-5 часа. Имах големи проблеми с неразбирането на this, особено когато стигнах до евентите. 

1
Valleri avatar Valleri 304 Точки

Относно разделянето на скрипта в отделни файлове, по обекти - може да се постигне с "подръчни материали" или с разни благинки като AMD, RequireJS и други.

Иначе може да направиш следното:
Cъздаваш един глобален namespace:

window.ShapesApp = window.ShapesApp || {};

Toест, ако не е дефиниран създай нов празен namespace. И това го слагаш в началото на всеки файл.

В .html файла трябва да добавиш скриптовете в подходящия ред за да не изкара undefined.

И последната важна стъпка е да инициализираш класовете си от този namespace, като негово пропърти:

ShapesApp.Shape = function() {.......};

Тоест те знаят един за друг защото са част от namespace-a.

3
02/11/2014 19:57:40
ZvetanIG avatar ZvetanIG 907 Точки

Тито, прав си за Draw() метода, но аз реших да го направя така, сторими се добра идея фигурите да не "разбират " от canvas.  Признавам, че не съм направил и нужната валидация.

0
02/11/2014 21:16:44
Ventsislav avatar Ventsislav 343 Точки

Здравей колега Kibork на първа видях че си пропуснал да направиш Circle.

Ето и моето решение на първа задача: Shapes.js , CanvasField.html .

Ще се радвам ако някой го погледне и сподели мнение laughing

4
03/11/2014 14:19:50
ZvetanIG avatar ZvetanIG 907 Точки

Добре си, го направил. Единствено бих подобрил фунцията canvas по следния начин:

canvas: function (canvasId) {
var canvas = {
element: document.getElementById(canvasId).getContext("2d")
};
return canvas;
}

Подавайки Id като параметър на фунцията, ще може да се ползва за различни canvas-и.

Не мога да разбера защо ти е този element. Не е ли  по-просто да се напише

var canvas = document.getElementById(canvasId).getContext("2d")
 
 
1
03/11/2014 11:18:24
Ventsislav avatar Ventsislav 343 Точки

ZvetanIG благодаря ти за коментара, ще го погледна. smile

0
03/11/2014 16:19:11
Nicky89 avatar Nicky89 15 Точки

Ето и моята версия на първа задачка: http://pastebin.com/EWK9fQ72 

Забележека: Не мога да разбера само защо валидацията ми на триъгълника не работи( Всички тригълници са ми невалидни) :(

0
RoYaL avatar RoYaL Trainer 6849 Точки

Без да ти пускам кода ще заложа защо.

Първо пускаш валидацията, която минава през SIDES обекта, който се опитва да се възползва от this._x2/y2 и т.н., а чак по-надолу инициализираш this._x2 

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

1
04/11/2014 15:42:25
Nicky89 avatar Nicky89 15 Точки

Да прав си, знаех си :)

П.С А как да достъпя properti-та на тригълника преди да го иниацилизирам?

0
04/11/2014 15:47:51
RoYaL avatar RoYaL Trainer 6849 Точки

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

0
viraldim avatar viraldim 21 Точки

Здравейте добри решения сте направили само мисля, че е добра идея да се направи валидация за входните данни за рисуването на обектите. Например дали трите точки при рисуването на триъгълник наистина образуват триъгълник и дали кординатите са в рамките на canvas-a. 

1
05/11/2014 03:10:00
Kibork avatar Kibork 87 Точки

Здравей, viraldim!

Много си прав, за валидацията, просто реших да спестя малко време и да го инвестирам във всичко останало което имаме, за домашна (Linux, Unity, подготовка за изпита по JS OOP, другото више, което уча паралелно със СофтУни, ...).

Реших, че това, което съм представил, ще е максимално от полза за тези които не са се занимавали преди с JavaScript. Докато с валидацията, предполагам, че всеки би се справил и сам.

 

Поздрави,

 

Димитър!

5
Karlie avatar Karlie 438 Точки

Хайде и аз да сложа моето решение. Не за друго, ами заради тази функция draw, понеже повечето досега публикуваните решения ми се струват много сложни.

Не знам как ми е домашното като качество, но пък си е 100% мое. Е, нямам валидация, но здраве да е :)

1
07/11/2014 03:00:11
LittleNinja avatar LittleNinja 71 Точки

Ето я и моята първа - Shapes. Мисля, че е с една идея по-различен поглед на нещата tongue-out. Може да погледнете и втора, макар че още не е довършена ( ако въобще я довърша.. laughing ) - CanvasAPI.

Лек и успешен ден от мен,
LittleNinja : )

1
06/11/2014 08:55:09
milen_vm avatar milen_vm 68 Точки

Ето и мойте задачи:

1. Shapes

2. Canvas Geometry API - демо

Добре че Наков удължи срока за предаване на домашното, та успях да си допиша втората задача. Отне ми почти три дни. И за двете задачи съм използвал едно също апи за създаване на фигурите.

Логиката за втората задача ми е следната:
Допулнителните полета ги генерирам динамично с JS-та, като съм сложил EventListener на селектора за вида на геометричната фигура и генерирам съответният html. Пак с EventListener на Add бутона прочитам стойностите на всички полета от html-а и съсздава фигура с geometry-api.js 'класа'. Запазвам фигурите в масив и след това с цикъл през масива рисувам всички фигури върху канваса и ги показвам като списък в селектора (който е за изтриване и промяна на z-индекса). Махането на фигура става като я изтривам от масива, зачиствам цялото съдържание на канваса и списъка, и вече промененият масив пак го пускам да се изрисува в канваса и в списъка. Z - индекса го променям като местя фигурите напред - назад из масива smile, и после отново ги пускам за рисуване и отпечатване с новата последователност. Това постоянно зачистване и последващо ново запълване на канваса и списъка май не е много ефективно и като станат много фигурите може да е бавно, но ми изглежда просто и лесно за имплементиране - пък и за друго не се сещам.  Сложил съм всички функции в модули, да не хвърчат свободно из глобалният скоуп cool.

Надявам се, макар и късно решенията ми да са полезни smile.

1
12/11/2014 16:44:25
Yulia avatar Yulia 1346 Точки

Уф, като гледам: няма да имам време да довърша задачата до довечера, така, че качвам каквото съм написала до тук. 1-ва и 2-ра са в едно приложение. Това е, което писах тази седмица: GitHub Source Все нещо ще има, от което да почерпите идея.

Не съм гледала ничии решения и това е начина, по който си представям нещата. Работи рисуването чрез някакво ООП (damn, без ООП е 1000 nъти по-лесно, за какво ни е това извращение...), но не съм имплементирала функционалността за разместванe на слоевете, няма валидации.
Но пък ме радва как изглежда: Live Demo

Иначе до преди месец писах нещо подобно без ООП - може да му се полюбувате: Live Demo, GitHub Source.

3
07/11/2014 15:00:46
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.