Разяснения по JS OOP


0

Сега съм захванал друга задачка да решавам - Academy Catalogs обаче гледайки различните решения, които са качени към нея се обърквам тотално. Веднъж се ползват setter-и и там се валидира, друга задачка имаше не се използват setter-и и се валидира в constructor-а, някъде в конструктора пропъртитата са с _ отпред, някъде не са. В моето решение на задачката първо не използвах сетер-и и валидирах в конструктора, после промених и написах сетер-и и сложих там валидациите, така пък тестовете пищят

"TypeError: Cannot set property items of #<Catalog> which has only a getter" обаче в авторските решения не виждам items да има сетер, пък и не виждам смисъл, нали в конструктора го задаваме като празен масив?

Направо ми е тотална каша с тоя Javascript. От решенията ТУК кое е как да кажа, "най-правилно" да гледам като помощно за да си напиша моето?




Отговори



0
Избери това, което го разбираш най- добре. Не се старай да решаваш по много начини. Избери един, който можеш да си обясниш кое, как и защо е така. Успех

от sstoimirov (380 точки)


1

Здрасти,

В javascript няма модификатори за достъп като public, private, protected както в други езици, затова е прието нещо като конвенция ако полето ти започва с "_" това да значи моля не пипай отвън това поле (нещо като private).

Гетъри и Сетъри са си точно както в другите езици. 

Когато имаш гетър и сетър , обикновено в гетъра се връща return _field, а в сетъра обикновено имаш валидация; this._field = value; Като в констръктора се извиква сетъра на полето.

Когато нямаш сетър, гетъра е както горе  return _field; но в конструктора се set-ва полето this._field = someConstructorParameter

Горе долу както във всеки друг език за програмиране.

Това къде ще правиш валидации си зависи от теб, но като цяло ако нещо ще се инициализира в конструктора и после няма да се променя можеш да си го направиш в конструктора, ако ще се променя е по-добре в сетър. Със сигурност проблема със сетърите не е в тестовете, а най-вероятно като си махал код си забравил да промениш да се set-ва директно полето.

Като цяло правилно няма, както каза колегата sstoimirov ползваш това което ти е удобно. Можеш да ползваш класове, можеш да ползваш модули и функции (Цъки показва на една от лекциите как се е правело преди наследяване). Аз лично си ползвам класовете(много по лесно се наследява с един extends , пък и имаш по-удобен синтаксис), правя си гетъри и сетъри, валидирам си в сетъра както го правя и в C#.


от ktsvetanov (705 точки)


0
Добре, мисля, че схванах за конструкторите, гетер-ите и сетер-ите. Сега нямам проблеми с грешки от типа на горната и така ще си пиша JS-a, наистина е доста по-удобно с класове и т.н. спрямо да се плескат само функции. Имам друг проблем сега, кой знае каква дреболия е, но от 15-тина минути не мога да я открия. При подадени валидни параметри при няколко теста моя код хвърля грешка за description-a, а не трябва. Пък на други тестове трябва да се хвърля, пък моя код не хвърля, а уж съм си направил проверките. Моя код.

от olebg (598 точки)