5
votes

Définir une fonction comme obsolète

Il y a quelques mois, j'ai créé une bibliothèque Js que j'ai publiée sur Npm. Maintenant, je voudrais renommer certaines fonctions. J'ai lu cet article et je pense que c'est très utile.

Supposons que j'ai un fichier A :

export { function1, sum } from './A'

Les fonctions exportées utilisables par les utilisateurs de la bibliothèque se trouvent dans le fichier index.js:

/** @deprecated since version 2.0 */
export function function1(param1, param2) {
  return sum(param1, param2)
}

export function sum(param1, param2) {
  return param1 + param2
}

et je veux le renommer en sum(param1, param2) .

Je crée cette fonction obsolete :

function obsolete(newFunction, oldFnName, newFnName) {
  const wrapper = function () {
    console.warn(
      `Obsolete function called. Function '${oldFnName}' has been deprecated, please use the new '${newFnName}' function instead.`
    )
    newFunction.apply(this, arguments)
  }
  wrapper.prototype = newFunction.prototype
  return wrapper
}

Maintenant que dois-je faire? Je suppose que je dois modifier le fichier A de cette manière:

export { function1 } from './A'

et ajoutez la fonction sum au fichier d'index:

export function function1(param1, param2) {
  return param1 + param2
}

Puis? Comment puis-je utiliser la fonction obsolete ?


0 commentaires

3 Réponses :


6
votes

Ok, donc cette question semble avoir été posée par votre commentaire:

Supposons que j'ai une fonction fun1 que je souhaite la rendre obsolète et que la nouvelle fonction est fun2. Comment puis-je utiliser cette fonction obsolète? Il semble interessant

Decette question .


Donc tout d'abord, vous obtenez une annotation JSdoc ( /** @deprecated since version 2.0 */ ) et cette fonction est mélangée.

JSDoc est un langage de balisage utilisé pour annoter les fichiers de code source JavaScript

la source

Cela n'est donc utile que si vous prévoyez de créer une annotation JSdoc. Ce que je présume que vous n'êtes pas.


Donc, en ignorant cela, je vais revenir à votre question sur ce code .

En regardant le code, vous pouvez l'utiliser comme (pas sûr à 100% car je ne l'ai pas écrit):

// the function from the previous question
function obsolete(oldFunc, newFunc) {
  const wrapper = function() {
    console.warn(`WARNING! Obsolete function called. Function ${oldFunc.name} has been deprecated, please use the new ${newFunc.name} function instead!`)
    newFunc.apply(this, arguments)
  }
  wrapper.prototype = newFunc.prototype
  return wrapper
}

// this is the function that is the replacement for obsfunc
function newfunc(){
  console.log('new called');
}

// this is the function that is being made "obsolete"
function obsfunc(p) {
  return obsolete(obsfunc, newfunc)();
}


// when you call the obsolete function it's actually the new function 
// that gets triggered and an error is displayed in the console.
obsfunc();

dans mon cas, les fonctions ont des paramètres et une valeur de retour

ce code ne prend pas en charge cela. Il n'y a aucun moyen officiel de «rendre obsolète» une fonction dans la spécification Js. TBH c'est la bonne réponse (maintenant supprimée) à cette question IMO. Vous devrez donc rédiger votre propre solution. Vous ne savez pas vraiment quelle est votre définition de «obsolète» non plus? Les décorateurs sont une bonne option


1 commentaires

Merci pour votre réponse mais dans mon cas, les fonctions ont des paramètres et une valeur de retour. Comment puis-je faire dans ce cas? Aussi, pouvez-vous expliquer un peu votre code? Et oui, j'utilise aussi JSdoc.



1
votes

Je me rends compte que cela n'est peut-être pas très utile, mais si vous travaillez avec babel, vous voudrez peut-être vous pencher sur les décorateurs es7, ils sont exactement destinés à des cas d'utilisation comme celui-ci. bien qu'ils n'aient toujours pas de support de navigateur natif, d'où Babel

function obsolete(newFuncGetter) 
{
  return (prototype, key, descriptor) => {
    descriptor.value = (...args) => {
        const newFunc = newFuncGetter();
    
      console.warn(`'${key}' has been deprecated, please use '${newFunc.name}' instead!`);

      return newFunc(...args);
    };
  
    return descriptor;
  };
}

class Foo
{
  static newfunc()
  {
    return 'new called';
  }

    @obsolete(() => Bar.newfunc)
  static obsfunc()
  {
    return 'old value';
  }
}


console.log(Bar.obsfunc());

J'ai découvert que babel autorise uniquement les décorateurs sur les classes et leurs objets, mais je pense que les décorateurs eux-mêmes devraient également autoriser des fonctions séparées


1 commentaires

ps le newFuncGetter est nécessaire car Bar n'est pas disponible autrement (car il n'est pas encore initialisé), donc une petite solution de contournement est nécessaire



3
votes

Il n'y a aucun moyen de "définir" une fonction comme obsolète. Vous créez simplement une fonction similaire à celle-ci:

function function1 () {
obsolete(function1(), "function1", "newFunction1")

}


0 commentaires