| 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: 10 let
|
|||
0