Напредна употреба ЦоффееСцрипт -а

Преглед садржаја
У прошлим водичима смо радили са класама, чинећи нашу апликацију модуларнијом, чак смо детаљно видели како изводити асинхрони рад користећи ЦоффееСцрипт као језик, што нам даје већи распон могућности за рад са њим.
Савладавши ове концепте, време је да одемо корак даље и да употребимо оно што знамо за писање чистијег, функционалнијег и наравно моћнијег кода. Време је да научите како да постанете моћни корисници ЦоффееСцрипт.
Сада када знамо како да користимо класе у нашој апликацији, само је питање времена када ћемо наићи на проблеме са њом. контекст. Када говоримо о једноставним функцијама, прилично је лако видети које податке ова функција има у свом опсегу, она познаје глобалне променљиве, променљиве дефинисане унутар функције и било коју променљиву која је дефинисана у локалном опсегу када је функција креирана.
Али када су методе везане за објекте, то постаје мало компликованије. Да бисмо то илустровали, погледајмо пример где можемо видети овај проблем, а затим ћемо видети како ЦоффееСцрипт може нам помоћи:
 класа Сидро за подизање брода: (донеЦаллбацк) -> цонсоле.лог "Подизање сидра." сетВел: (спеед) -> цонсоле.лог "Сеттинг спеед то # {спеед}" сет саил: -> @левантарАнцла @ фикВел 70
Претпоставимо тада према нашем коду да желимо одмах отпловити, за то радимо следеће да бисмо позвали нашу функцију:
 бот = нови Барцо бот.зарпар ()
Ако помно погледамо и пренесемо овај код у стварни свет, можемо схватити да се подизање сидра не догађа одмах, морамо чекати да се сидро потпуно подигне да бисмо могли испловити. Овај проблем можемо решити додавањем а позове и питајући да ли је довршена, па ћемо знати колико траје ова акција и позваћемо нашу функцију када се заврши, да видимо:
 лифтАнцхор: (донеЦаллбацк) -> цонсоле.лог "Подизање сидра." иф донеЦаллбацк? сетТимеоут донеЦаллбацк, 1000
Као што видимо, позивамо повратни позив само ако постоји, на овај начин се постарамо да се овај процес заврши, па стога морамо изменити своју функцију испловити:
 испловити: -> @ левантарАнцла -> @ фикВел 70
Сада позивамо функцију испловити Након подизања сидра, ово осигурава да се нећемо померити све док се сидро не подигне у потпуности. Ово изгледа прилично добро, саставићемо наш код и укључићемо генерисану .јс датотеку у ХТМЛ да бисмо видели одговор помоћу конзоле:

Као што видимо на слици, добили смо грешку у којој се каже да функција не постоји. Шта се десило? Врло је једноставно, ЈаваСцрипт је поставио вредност Есте на начин на који је функција позвана, од када се позива бот.зарпар вредност Есте је повезан са објектом бот, тако да је ово везано за глобални контекст и то није оно што желимо.
Оно што желимо да урадимо је да се у то уверимо Есте је увек повезан са инстанцом бот унутар тела повратног позива и од тада имамо среће ЦоффееСцрипт има функционалност за тај случај. За ово ћемо функцију прогласити са дебела стрела или дебелу стрелицу, на овај начин функција ће имати Есте повезани са контекстом у коме је декларисан, да видимо како изгледа наш код са овом променом:
 класа Сидро за подизање брода: (донеЦаллбацк) -> цонсоле.лог "Сидро за подизање." иф донеЦаллбацк? сетТимеоут донеЦаллбацк, 1000 сетВел: (спеед) -> цонсоле.лог "Сеттинг спеед то # {спеед}" сет саил: -> @левантарАнцла => @фикВел 70 бот = нев Барцо бот.зарпар ()
Хајде да саставимо нашу датотеку и видимо како ЦоффееСцрипт Повезивање постигнућа са функцијом дебеле стрелице:

Шта ради ЦоффееСцрипт пре проглашења позове је да поставите локалну променљиву _Есте, који се односи на Есте, будући да иако позове је динамички везан за вредност и даље учитава локални контекст у којем је декларисан. Коначно, извршићемо генерисану датотеку, а затим ћемо видети како је грешка решена:

Пошто смо већ видели како да решимо проблем контекста у нашим апликацијама помоћу ЦоффееСцрипт Видећемо прилично једноставну, али моћну технику која ће нам помоћи да уштедимо посао. То није напредна техника, али је логичан начин за побољшање нашег кода без много напора са наше стране.
МемоизацијаКоја је техника мемоизација је складиштење вредности функције уместо поновног израчунавања сваки пут када се функција позове. Сада када знамо како да користимо класе и објекте, можемо користити ово знање да их применимо у оквиру ЦоффееСцрипт и користити дотичну технику.
Постоји много начина за спровођење процеса мемоизација, у случају овог водича ствари ћемо поједноставити. У том смислу, оно што ћемо учинити је да ћемо, када се затраже одређене информације, проверити да ли су ускладиштене, ако је тако, одмах их враћамо, у противном их можемо израчунати и сачувати за будућу употребу. Ова техника је изузетно корисна када требамо користити сложени алгоритам за примање одговора или у случају да користимо спору мрежу за добијање информација.
Погледајмо код како бисмо илустровали ову технику:
 класа Роцкет гетПатх: -> @патх? = @доМатхЦомплекПроцесс ()
Да бисмо боље објаснили овај део кода, саставићемо га да видимо како ЦоффееСцрипт изградити ЈаваСцрипт да ће наша техника морати да нас спаси од рада на нашем развоју, да видимо како изгледа наш код:

ЕНЛАРГЕ

Као што можемо видети у нашем коду, прорачун путање ће се извршити само први пут захтев а сачувана вредност ће се од сада користити. Такође смо могли видети у нашем коду ЦоффееСцрипт да смо имали помоћ терцијарног оператера ?= који ће проценити израз у случају да је путања нулл, додатно ћемо имати помоћ од имплицитног враћања функција које ће вратити резултат израза, у овом случају вредност @трајецтори да ли је претходно ускладиштен или је тек израчунат.
Али то није све што можемо учинити са нашом новом техником ЦоффееСцрипт, чак можемо да ускладиштимо више вредности користећи структуру података, да видимо како то можемо:
 класа СецуритиГатеваи хасАццесс: (гуард) -> @аццесс? = {} @аццесс [гуард.плате_нумбер]? = верифиЦредентиалс гуард.плате_нумбер
Оно што овај део кода ради је да се у нашем објекту резултат чува за сваког чувара који је затражио приступ, требало би нам само нешто јединствено да бисмо их могли идентификовати у нашем објекту, па ћемо за овај задатак користити број таблице, да видимо како се наш код преводи када га састављамо:

ЕНЛАРГЕ

Важно је напоменути да ову технику треба користити само са информацијама које се неће променити током извршавања нашег програма, у случају да јесте, препоручујемо имплементацију решења заснованог на кеш.
Коначно ћемо видети начин преношења опција на функцију, ово није посебна функција ЦоффееСцриптТо је више конвенција која користи многе карактеристике језика, користећи их у обрасцу који је лако разумљив и који је једнако користан у многим ситуацијама које могу настати.
Како то функционише?Идеја иза овога је једноставна, то је имати функцију која то прихвата објекат опција који могу садржати асоцијативне кључеве за аргументе те функције. Ово чини опције лако разумљивим из кода у којем се позивају јер постоје увијене заграде које идентификују шта свака вредност ради. Ово такође смањује гњаважу при праћењу аргумената, као и њиховом редоследу, пошто објекцијски кључеви не зависе од овога и могу се изоставити ако није потребно.
За имплементацију опције објеката прво ћемо користити опционалне аргументе да задано поставимо празан аргумент. На овај начин, приликом упућивања позива, можемо изоставити опције у случају да вредности нису потребне:
 лаунцхНаве = (наме, оптионс = {}) -> ретурн иф оптионс.дрифт дри таке офф ()
Сада ћемо користити терцијарни оператор ?= да попунимо вредности опција за које желимо да имају посебну подразумевану вредност:
 лаунцхНаве = (наме, оптионс = {}) -> оптионс.цоунт? = 10 цонсоле.лог "# {и}…" за и у [оптионс.цоунт… 0] ретурн иф оптионс.дрифт дри таке офф ()
Дефинишемо последњу вредност и користимо оператор ? у случају да се користи на једном месту:
 лаунцхСаве = (наме, оптионс = {}) -> цхецкФуел (оптионс.ваитЦомб? 100) оптионс.цоунт? = 10 цонсоле.лог "# {и}…" за и у [оптионс.цоунт… 0] ретурн иф оптионс. суво скидање ()
Коначно, користимо дозвољену синтаксу ЦоффееСцрипт да пошаљемо опције нашој функцији без заграда, дајући нам прилично једноставан и природан позив:
 лансирни брод "Милленниум Фалцон", ДриГеар: истина, одбројавање: 15
За крај ћемо саставити нашу датотеку и видети излаз нашег кода у ЈаваСцрипт:

ЕНЛАРГЕ

Са овим последњим смо завршили овај водич, где смо могли да научимо не само напредне начине коришћења ЦоффееСцрипт већ технике које ће нам помоћи да напишемо бољи код, да са сталном употребом и истраживањем можемо постати бољи програмери који користе најбоље праксе за развој апликација.
wave wave wave wave wave