Autor Zpráva
Bez_názvu.jpg
Profil *
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.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: