Autor | Zpráva | ||
---|---|---|---|
Bez_názvu.jpg Profil * |
#1 · Zasláno: 10. 5. 2016, 16:43:16
Zdravim,
jak se díváte na následující vzor (funkce ve funkci) pro vytvoření "privátní" funkce? Používáte? (Všimněte si, že loadDetails je deklarována uvnitř loadFullArticle a že se používá na dvou místech.) import { loadBasicArticleData, getArticleData, loadExtraArticleData } from "articleService"; export function loadFullArticle(articleId) { if (getArticleData(articleId) == null) { // if the basic data hasn't loaded yet, load it first loadBasicArticleData(articleId, loadDetails); // druhy parametr je callback } else { // if the basic data is already loaded, just load the details loadDetails(); } function loadDetails() { // load extra data like comments, related articles etc. loadExtraArticleData(articleId); } } Argument pro použití tohoto konstruktu je, že pokud funkce má opakující se logiku (tudíž je rozumné ji vytknout do funkce, viz loadDetails) nemá smysl novou (extrahovanou) funkci deklarovat vně funkce. S tím v teoretické rovině souhlasím, ale vnitřně s tím mám problém, i když pro to nemám žádne racionální argumenty (spíš jen vnitřní pocit, že vytvářet objekt, který je určený k znovupoužití, při každém jeho použití je divný). Já osobně bych loadDetails deklaroval vně loadFullArticle a articleId předal jako parametr. Jeden (trochu racionální) argument, co mě napadá, je výkon. Na to se ale dá odpovědět předčasná optimalizace, nebo optimalizace v prohlížečích (to sem se taky většinou dočet v článcích o tématice). Jaký na to máte názor? Máte nějaké argumenty (třeba pokles výkonu v reálné aplikaci), proč je jeden z těch způsobů (deklarace uvnitř/venku) lepší? |
||
Radek9 Profil |
Bez_názvu.jpg:
Jak se to vezme. Pokud jsi nucen použít callbacky, tak asi lepší varianta nebude. Má-li ta vnitřní funkce využití jen pro tu jednu konkrétní funkci, tak nemá smysl ji deklarovat venku. Pokud ale máš možnost to přepsat na promise pattern s použitím generátorů a např. knihovny Q, tak by to mohlo vypadat třeba takhle: import { loadBasicArticleData, getArticleData, loadExtraArticleData } from "articleService"; import Q from "q"; export const loadFullArticle = Q.async(function* (articleId) { if (getArticleData(articleId) == null) { // if the basic data hasn't loaded yet, load it first yield loadBasicArticleData(articleId); } // load extra data like comments, related articles etc. yield loadExtraArticleData(articleId); }); Počítá se s tím, že funkce loadBasicArticleData a loadExtraArticleData vrací Promise . Ta funkce loadFullArticle potom taktéž vrací Promise .
Edit: Stejného efektu se dá docílit i s použitím knihovny Bluebird a její funkce Promise.coroutine . Což je teoreticky lepší varianta.
|
||
Časová prodleva: 7 let
|
0