{"id":229039,"date":"2022-11-02T11:13:00","date_gmt":"2022-11-02T08:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229039"},"modified":"2022-11-09T05:18:11","modified_gmt":"2022-11-09T02:18:11","slug":"singletons-en-wordpress-revisado-un-tiempo-y-un-lugar","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/singletons-en-wordpress-revisado-un-tiempo-y-un-lugar\/","title":{"rendered":"Singletons en WordPress, revisado (\u00bfun tiempo y un lugar?)"},"content":{"rendered":"\n<p>Antes de comenzar una publicaci\u00f3n hablando sobre el uso de singletons en WordPress (o, m\u00e1s apropiadamente, el <a href=\"https:\/\/tommcfarlin.com\/singleton-pattern-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Patr\u00f3n Singleton<\/a> ), quiero asegurarme de que lea los siguientes dos art\u00edculos:<\/p>\n<ul>\n<li><a href=\"http:\/\/wpkrauts.com\/2013\/cloning-in-php-or-why-your-singleton-might-kill-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Clonaci\u00f3n en PHP, o por qu\u00e9 su singleton podr\u00eda acabar con WordPress<\/a> por <a href=\"https:\/\/twitter.com\/toscho\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Thomas Scholz<\/a><\/li>\n<li><a href=\"https:\/\/carlalexander.ca\/singletons-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singletons y su uso en WordPress<\/a> por <a href=\"https:\/\/twitter.com\/twigpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Carl Alexander<\/a><\/li>\n<\/ul>\n<p>Ambos art\u00edculos brindan una perspectiva inmensamente valiosa sobre este patr\u00f3n y los peligros de usarlo cada vez que lo usamos a lo largo de nuestro trabajo en WordPress; sin embargo, \u00bfeso significa que debemos evitarlos por completo?<\/p>\n<p>No me parece.<\/p>\n<p>Por otra parte, tambi\u00e9n reconozco que los art\u00edculos no dicen que los evite por completo. Est\u00e1n dando casos s\u00f3lidos sobre c\u00f3mo usarlos y los peligros de usarlos si opta por hacerlo.<\/p>\n<p>Y aunque definitivamente los he usado en el pasado, por lo general he dejado de hacerlo. Sin embargo, recientemente encontr\u00e9 un caso de uso para un proyecto en el que creo que es aceptable.<\/p>\n<h2>\u00bfSigues usando Singletons en WordPress?<\/h2>\n<p>Para dar una raz\u00f3n de por qu\u00e9 incluso considero este patr\u00f3n en particular, creo que primero vale la pena comprender el caso de uso. Para hacerlo mas simple:<\/p>\n<ul>\n<li>Hay una p\u00e1gina de administraci\u00f3n que le permite al usuario seleccionar c\u00f3mo le gustar\u00eda mostrar las fechas en el front-end del sitio.<\/li>\n<li>Cuando el usuario guarde la opci\u00f3n, escribir\u00e1 el formato <a href=\"https:\/\/php.net\/manual\/en\/function.date.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">basado en PHP para la fecha en una tabla en WordPress.<\/a><\/li>\n<li>Al representar una fecha, el valor se recuperar\u00e1 de la base de datos y se aplicar\u00e1 a la fecha que se va a representar.<\/li>\n<\/ul>\n<p>Y para aquellos que tienen curiosidad, solo hay un pu\u00f1ado, digamos cuatro o cinco, formas en que permitimos que el usuario muestre la fecha.<\/p>\n<p>Debido a que este proyecto en particular permite a los usuarios importar CSV de datos (que incluyen fechas) y eso les permite representar datos de los CSV aunque en un formato diferente, vale la pena se\u00f1alar que hay una buena cantidad de formato de fecha en el back-end.<\/p>\n<p>Naturalmente, surge una pregunta:<\/p>\n<p>\u00bfPor qu\u00e9 no simplemente formatear la fecha cuando el usuario importa su CSV?<\/p>\n<p>Y eso se debe a que el usuario puede optar por cambiar la forma en que se representa la fecha despu\u00e9s de que se haya importado el CSV.<\/p>\n<p>Dicho esto, existe todo este otro mecanismo en el complemento responsable de validar, desinfectar y escribir la entrada del usuario en la base de datos.<\/p>\n<p>Pero cuando llega el momento de obtener valores de la base de datos, especialmente cuando se trata de leer un valor de una tabla de base de datos y hacerlo en m\u00faltiples puntos a lo largo de la aplicaci\u00f3n, \u00bfno tendr\u00eda sentido tener un solo punto desde que el valor se puede derivar?<\/p>\n<p>Una mirada de alto nivel a c\u00f3mo funciona esto.<\/p>\n<p>O, de otra manera, \u00bfno tiene sentido cambiar un lugar en la aplicaci\u00f3n que puede conectarse f\u00e1cilmente en cascada en el resto de la aplicaci\u00f3n en lugar de buscar todos los lugares posibles de:<\/p>\n<ol>\n<li>leyendo la opci\u00f3n,<\/li>\n<li>asegur\u00e1ndose de que est\u00e9 configurado,<\/li>\n<li>definir un valor predeterminado si no est\u00e1 establecido,<\/li>\n<li>y devolver el valor?<\/li>\n<\/ol>\n<p>Y aqu\u00ed es donde veo que entra en juego un uso v\u00e1lido de un singleton en WordPress: una forma de leer datos en m\u00faltiples puntos a lo largo de la aplicaci\u00f3n. Sin embargo, esto conlleva algunas implicaciones:<\/p>\n<ul>\n<li>la clase no necesita ser instanciada m\u00e1s de una vez (quiero decir, esa es toda la idea del singleton),<\/li>\n<li>no tratar\u00e1 con datos mutables,<\/li>\n<li>no ser\u00e1 escribir informaci\u00f3n o manipular informaci\u00f3n.<\/li>\n<\/ul>\n<p>En otras palabras, es el \u00fanico responsable de recuperar la informaci\u00f3n y devolverla. Eso es todo. Nada m\u00e1s.<\/p>\n<h3>Una implementaci\u00f3n de ejemplo<\/h3>\n<p>Entonces, \u00bfc\u00f3mo podr\u00eda ser esto? Aqu\u00ed hay <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-singleton-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">una implementaci\u00f3n aproximada<\/a> para el prop\u00f3sito de la conversaci\u00f3n:<\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    private static $instance;\n\n    private function __construct() {\n    }\n\n    private static function get_instance() {\n\n        if (null === self::$instance) {\n            self::$instance = new self;\n        }\n\n        return self::$instance;\n    }\n\n    public static function get() {\n\n        self::get_instance();\n\n        $default_format = 'm\/d\/Y';\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Como ves, cumple con todos los puntos anteriores. Es decir, lee datos, establece un valor predeterminado y luego lo devuelve.<\/p>\n<p>Esta clase no hace nada m\u00e1s que leer y devolver un conjunto de datos muy espec\u00edfico.<\/p>\n<h3>Una advertencia sobre el almacenamiento en cach\u00e9<\/h3>\n<p>Obviamente, dado que esta clase est\u00e1 leyendo datos de la base de datos, puede almacenarse en cach\u00e9, y posiblemente deber\u00eda almacenarse en cach\u00e9. Sin embargo, el objetivo de esta publicaci\u00f3n no es entrar en transitorios, vencimientos y trabajar con todos esos matices.<\/p>\n<p>En cambio, se trata de evaluar si este es o no un caso de uso v\u00e1lido para implementar un singleton en WordPress.<\/p>\n<h2>\u00a1Espera, no tiene por qu\u00e9 ser as\u00ed!<\/h2>\n<p>S\u00e9 que s\u00e9. <a href=\"https:\/\/www.youtube.com\/watch?v=yeEp7BA2mLg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00a1 psic\u00f3logo<\/a>! Creo que es la terminolog\u00eda correcta, pero mantengamos este estilo profesional.<\/p>\n<p>Hasta este punto, toda la publicaci\u00f3n hablaba sobre por qu\u00e9 es posible que desee investigar el uso de singletons en WordPress para que tenga una forma de recuperar informaci\u00f3n f\u00e1cilmente utilizando principios consistentemente orientados a objetos.<\/p>\n<p>Pero todav\u00eda no creo que sea necesario usar un singleton en WordPress aqu\u00ed. Como m\u00ednimo, creo que una funci\u00f3n est\u00e1tica est\u00e1 bien. Y la \u00fanica raz\u00f3n por la que creo que est\u00e1 bien es porque crear una instancia de la clase cada vez que necesita acceder a una funci\u00f3n que recupera datos que no cambiar\u00e1n dentro de la clase es una exageraci\u00f3n.<\/p>\n<p>Entonces, \u00bfc\u00f3mo es este <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-refactored-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aspecto<\/a>? <\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    public static function get() {\n\n        $default_format = 'm\/d\/Y';\n\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Y eso, creo, es una mejor soluci\u00f3n que implementar un patr\u00f3n de dise\u00f1o arbitrario cuando no se necesita en absoluto.<\/p>\n<p>Pero estoy abierto a que me convenzan de lo contrario.<\/p>\n<h2>\u00bfPensamientos de desarrolladores m\u00e1s experimentados?<\/h2>\n<p>Escuch\u00e9 de un amigo y compa\u00f1ero que simplemente usar una funci\u00f3n de espacio de nombres podr\u00eda ser el camino a seguir. Claramente, hay una variedad de formas de abordar esto.<\/p>\n<p>Y con eso, me interesa saber del resto de ustedes c\u00f3mo pueden refactorizar esto a\u00fan m\u00e1s. No estoy muy preocupado por la implementaci\u00f3n de la\u00a0 funci\u00f3n <strong>get<\/strong>, ya que se cre\u00f3 principalmente para la demostraci\u00f3n.<\/p>\n<p>En cambio, estoy interesado en formas de manejar esto fuera de lo que se presenta aqu\u00ed. O, m\u00e1s bien, simplemente tu opini\u00f3n sobre lo que ves.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tal vez desee implementar singletons en WordPress para leer datos f\u00e1cilmente. Sin embargo, no tiene por qu\u00e9 ser as\u00ed.a<\/p>\n","protected":false},"author":1,"featured_media":221011,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,861],"tags":[1172],"class_list":["post-229039","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229039"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/221011"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}