<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LcsGa</title>
    <description>The latest articles on DEV Community by LcsGa (@lcsga).</description>
    <link>https://dev.to/lcsga</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F470566%2Fbda2d7de-e2b0-4afd-a5fa-2983b0ae670b.jpg</url>
      <title>DEV Community: LcsGa</title>
      <link>https://dev.to/lcsga</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lcsga"/>
    <language>en</language>
    <item>
      <title>Introduction au CSS "utile"</title>
      <dc:creator>LcsGa</dc:creator>
      <pubDate>Sun, 21 Sep 2025 10:54:29 +0000</pubDate>
      <link>https://dev.to/lcsga/introduction-au-css-utile-49</link>
      <guid>https://dev.to/lcsga/introduction-au-css-utile-49</guid>
      <description>&lt;h2&gt;
  
  
  Le CSS : un éternel mal-aimé ? 🤔
&lt;/h2&gt;

&lt;p&gt;Depuis des années, j'ai vu d'innombrables développeurs se battre avec le CSS.&lt;br&gt;
On entend souvent qu'il est imprévisible, difficile à maintenir et qu'il mène inévitablement à des solutions de contournement lourdes et peu élégantes.&lt;br&gt;
Mais et si le problème n'était pas le CSS lui-même, mais la façon dont on l'aborde ?&lt;/p&gt;

&lt;p&gt;Je suis convaincu que cette frustration repose sur deux erreurs fondamentales.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. La méconnaissance de ses fonctionnalités
&lt;/h3&gt;

&lt;p&gt;Nombreux sont ceux qui n'exploitent qu'une fraction du potentiel du CSS. On se limite aux propriétés de base et on contourne les difficultés en créant des classes à tout-va, comme en témoigne l'existence d'outils comme &lt;a href="https://getbem.com/" rel="noopener noreferrer"&gt;BEM&lt;/a&gt;.&lt;br&gt;
Cette approche, conduit trop souvent au « class hell » où l'on perd un temps fou à essayer de nommer des éléments, au lieu de s'appuyer sur la richesse native du langage.&lt;/p&gt;

&lt;p&gt;La solution ? Plonger dans les fondamentaux :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sélecteurs et &lt;strong&gt;Spécificité :&lt;/strong&gt; Comprendre comment les sélecteurs fonctionnent (la base même du CSS) permet de cibler des éléments sans surcharger le HTML de classes.&lt;br&gt;
On devrait d'abord penser balises sémantiques, pseudo-éléments, pseudos-classes, et attributs "fonctionnels".&lt;br&gt;
Les classes devraient être un dernier recours, utilisées de manière utilitaire et ciblée (non générique).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Propriétés adaptées au besoin :&lt;/strong&gt; Certaines sont encore sous-utilisées alors qu’elles simplifient grandement la vie.&lt;br&gt;
L’exemple le plus parlant : centrer une &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;. Il fut un temps où c’était un casse-tête, devenu même un mème sur Internet.&lt;br&gt;
Aujourd’hui on utilise &lt;strong&gt;Flexbox partout&lt;/strong&gt;... quitte à ignorer &lt;strong&gt;Grid&lt;/strong&gt;, pourtant bien plus adapté dans la très grande majorité des cas.&lt;br&gt;&lt;br&gt;
Il en résulte qu'on multiplie les wrappers inutiles, et donc les classes à nommer inutilement.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. L'absence d'architecture CSS
&lt;/h3&gt;

&lt;p&gt;On pense l'architecture de notre application, mais le CSS est souvent laissé pour compte. Or, le style peut et &lt;strong&gt;doit&lt;/strong&gt; aussi être structuré.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Appliquer les principes SOLID :&lt;/strong&gt; Oui, les principes de conception logicielle — comme le &lt;strong&gt;SRP (Single Responsibility Principle)&lt;/strong&gt; par exemple — s'appliquent aussi au CSS.&lt;br&gt;
Chaque composant et chaque style devrait avoir une unique raison de changer, facilitant ainsi la maintenance et la réutilisation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Découper son code :&lt;/strong&gt; Le CSS d'une application devrait refléter son architecture.&lt;br&gt;
Pour un code plus propre et plus facile à gérer, il est préférable de décomposer son application en petits composants granulaires et de lier le style à chaque composant.&lt;br&gt;
Mieux vaut 10 composants de 100 lignes (bien isolés) qu'un seul de 1000 lignes (où tout dépend de tout) !&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Le CSS "utile" : redorer le blason d'un langage laissé de côté
&lt;/h3&gt;

&lt;p&gt;Tandis que le JavaScript, le TypeScript, les frameworks comme Angular, les tests, l'architecture applicative, etc. bénéficient d'une multitude de contenus, le CSS est souvent relégué au second plan.&lt;br&gt;
Il existe bien des articles et tutoriels présentant des fonctionnalités isolées, mais il y a un manque criant d'informations sur la façon de structurer, d'optimiser et de maintenir son code CSS sur le long terme.&lt;/p&gt;

&lt;p&gt;Cet article est le premier d'une série qui a pour but de changer cela.&lt;br&gt;
Je veux explorer le &lt;strong&gt;CSS "utile"&lt;/strong&gt; : celui qui vous fait gagner du temps, qui simplifie la maintenance et qui vous donne un contrôle total sur votre design.&lt;br&gt;
Nous verrons comment écrire des sélecteurs sans douleur, adopter les bonnes pratiques d'architecture et découvrir des astuces concrètes.&lt;/p&gt;

&lt;p&gt;À l'heure où des solutions comme &lt;strong&gt;Tailwind&lt;/strong&gt; dominent la discussion, je veux montrer que le CSS natif est non seulement une alternative viable, mais souvent une approche bien plus confortable, maintenable et scalable.&lt;br&gt;
C'est en comprenant le cœur du CSS que l'on réalise que les solutions basées sur des utilitaires, le BEM, et d'autres approches similaires, répondent souvent à de fausses problématiques.&lt;/p&gt;

&lt;p&gt;Alors, prêt(e) à se réconcilier avec le CSS ?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>frontend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Angular Signals Don't Replace Observables: Pull vs. Push</title>
      <dc:creator>LcsGa</dc:creator>
      <pubDate>Wed, 10 Sep 2025 22:46:16 +0000</pubDate>
      <link>https://dev.to/lcsga/angular-signals-dont-replace-observables-pull-vs-push-49l7</link>
      <guid>https://dev.to/lcsga/angular-signals-dont-replace-observables-pull-vs-push-49l7</guid>
      <description>&lt;p&gt;Recently, we've seen many developers trying to replace RxJS by creating their own "operators" for Angular's signals. This approach is understandable, but it can lead to subtle errors. To avoid them, it's essential to understand the distinction between two reactivity models: &lt;strong&gt;Push&lt;/strong&gt; and &lt;strong&gt;Pull&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Push (Observables): Every Pushed Value Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;Push&lt;/strong&gt; model, the emitter (the source) is in control. It emits values into an "observable" stream, and each emitted value &lt;strong&gt;exists&lt;/strong&gt; independently. These values are then processed, one by one, by those who are observing them.&lt;/p&gt;

&lt;p&gt;Imagine a production line: each part that passes exists independently. If you stand along the line to observe, you'll see every part pass, without exception. If you arrive late, you've simply missed the first few parts. They've been sent, and they aren't waiting for you.&lt;/p&gt;

&lt;p&gt;👉 This model is ideal for managing &lt;strong&gt;data streams&lt;/strong&gt;, where every value is important.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Pull (Signals): Only the Last Pulled Value Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;Pull&lt;/strong&gt; model, the consumer is in control. A value is only of interest when it's explicitly read. The consumer will "pull" the value when they need it. This implies that transient values that are not read are irrelevant.&lt;/p&gt;

&lt;p&gt;Imagine a digital display board at a train station. It's constantly updated, showing real-time information about trains. There might be dozens of updates per second, but the traveler only sees the last version displayed when they look up. The intermediate updates don't matter to them. Only the latest version of the board's state is relevant.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Signals&lt;/strong&gt; are therefore perfect for managing a &lt;strong&gt;state&lt;/strong&gt; where only the latest version matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Some Operators Make Sense and Others Don't&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This distinction between Push and Pull is crucial for understanding why certain operators work with signals and others don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ What Works: Operating on the Final State&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Operators that don't care about the history and only react to the change in the final state will work well with signals. For example, a &lt;code&gt;double&lt;/code&gt; operator is perfect for a signal. It simply reads the current value, multiplies it by two, and returns the result. It needs nothing else.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doubledCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;doubledCount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;❌ What Doesn't Work: Needing the History&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Operators like &lt;code&gt;filter&lt;/code&gt; or &lt;code&gt;take&lt;/code&gt; are designed to work with data streams. Adapting them to signals is risky. Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;filter&lt;/code&gt; trap:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a signal initialized to &lt;code&gt;1&lt;/code&gt; (&lt;code&gt;const counter = signal(1)&lt;/code&gt;) and a resulting signal (a &lt;code&gt;computed&lt;/code&gt; for example) that only keeps even numbers. If you do &lt;code&gt;counter.set(2)&lt;/code&gt;, then &lt;code&gt;counter.set(3)&lt;/code&gt;, the resulting signal will never see the value &lt;code&gt;2&lt;/code&gt;. In fact, if you only pull the final value, the signal will only consider the last value, which is &lt;code&gt;3&lt;/code&gt; (odd), and filter it out. Thus, the result will never be what you expected.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evenCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;evenCounter&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// undefined =&amp;gt; instead of 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Conversely, if the last value is &lt;code&gt;4&lt;/code&gt;, you'll get the false impression that your operator is working correctly.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evenCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;evenCounter&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 4 =&amp;gt; tricky result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;take&lt;/code&gt; trap:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Similarly, with the same &lt;code&gt;counter&lt;/code&gt; signal initialized to &lt;code&gt;1&lt;/code&gt;, if you perform &lt;code&gt;counter.set(2)&lt;/code&gt;, then &lt;code&gt;counter.set(3)&lt;/code&gt;, then &lt;code&gt;counter.set(4)&lt;/code&gt;, a &lt;code&gt;take(3)&lt;/code&gt; operator will only consider the last value (&lt;code&gt;4&lt;/code&gt;). It will have no idea that the values &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt;, and &lt;code&gt;3&lt;/code&gt; ever existed. For it, this is its first (and only) iteration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;In Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt; are optimized for managing the application's &lt;strong&gt;state&lt;/strong&gt; (Pull model), while &lt;strong&gt;RxJS&lt;/strong&gt; is perfect for managing &lt;strong&gt;data streams&lt;/strong&gt; (Push model).&lt;/p&gt;

&lt;p&gt;Before using one or the other, ask yourself the following question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Do I need to know the history of the data, or does only the latest value matter to me?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If only the latest value matters, signals are for you. Otherwise, an observable is probably the better solution.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>rxjs</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Les Signals Angular ne remplacent pas les Observables : Pull vs Push</title>
      <dc:creator>LcsGa</dc:creator>
      <pubDate>Mon, 01 Sep 2025 00:04:22 +0000</pubDate>
      <link>https://dev.to/lcsga/les-signals-angular-ne-remplacent-pas-les-observables-push-vs-pull-4jk1</link>
      <guid>https://dev.to/lcsga/les-signals-angular-ne-remplacent-pas-les-observables-push-vs-pull-4jk1</guid>
      <description>&lt;p&gt;Récemment, on voit de nombreux développeurs tenter de remplacer RxJS en créant leurs propres "opérateurs" pour les signals d'Angular. Cette démarche est compréhensible, mais elle peut entraîner des erreurs subtiles. Pour les éviter, il est essentiel de bien comprendre la distinction entre deux modèles de réactivité : &lt;strong&gt;Push&lt;/strong&gt; et &lt;strong&gt;Pull&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Push (Observables) : Chaque donnée poussée compte&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dans le modèle &lt;strong&gt;Push&lt;/strong&gt;, l’émetteur (la source) est aux commandes. Il émet des valeurs dans un flux "observable", et chaque valeur émise &lt;strong&gt;existe&lt;/strong&gt; indépendamment. Ces valeurs sont ensuite traitées, une par une, par ceux qui les observent.&lt;/p&gt;

&lt;p&gt;Imaginez une chaîne de montage : chaque pièce qui passe existe indépendamment. Si vous vous placez le long de la chaîne pour observer, vous verrez chaque pièce passer, sans exception. Si vous arrivez en retard, vous avez simplement raté les premières pièces. Elles ont été envoyées, mais elles ne vous attendent pas.&lt;/p&gt;

&lt;p&gt;👉 Ce modèle est idéal pour gérer des &lt;strong&gt;flux de données&lt;/strong&gt;, où chaque valeur a son importance.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Pull (Signals) : Seule la dernière valeur tirée compte&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dans le modèle &lt;strong&gt;Pull&lt;/strong&gt;, c’est le consommateur qui est aux commandes. Une valeur n’a d’intérêt que lorsqu’elle est explicitement lue. Le consommateur "tirera" la valeur au moment où il en a besoin. Cela implique que les valeurs transitoires qui ne sont pas lues n’ont aucune importance.&lt;/p&gt;

&lt;p&gt;Imaginez un tableau d'affichage numérique dans une gare. Il est constamment mis à jour, affichant des informations en temps réel sur les trains. Il peut y avoir des dizaines de mises à jour par seconde, mais le voyageur ne verra que la dernière version affichée lorsqu’il lève les yeux. Les mises à jour intermédiaires ne comptent pas pour lui. Seule la dernière version de l’état du tableau est pertinente.&lt;/p&gt;

&lt;p&gt;👉 Les &lt;strong&gt;signals&lt;/strong&gt; sont donc parfaits pour gérer un &lt;strong&gt;état&lt;/strong&gt; dont seule la dernière version compte.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Pourquoi certains opérateurs ont du sens et d'autres non&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Cette distinction entre Push et Pull est cruciale pour comprendre pourquoi certains opérateurs fonctionnent avec les signals et d’autres non.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Ce qui fonctionne : opérer sur l'état final.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les opérateurs qui ne se préoccupent pas de l’historique et réagissent uniquement au changement d’état final fonctionneront bien avec les signals. Par exemple, un opérateur &lt;code&gt;double&lt;/code&gt; est parfait pour un signal. Il lit simplement la valeur actuelle, la multiplie par deux et retourne le résultat. Il n’a besoin de rien d’autre.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doubledCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;doubledCount&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;❌ Ce qui ne fonctionne pas : avoir besoin de l'historique.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les opérateurs comme &lt;code&gt;filter&lt;/code&gt; ou &lt;code&gt;take&lt;/code&gt; sont conçus pour travailler avec des flux de données. Les adapter aux signals est risqué. Pourquoi ?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Le piège de &lt;code&gt;filter&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imaginez un signal initialisé à &lt;code&gt;1&lt;/code&gt; (&lt;code&gt;const counter = signal(1)&lt;/code&gt;) et un signal résultant (un &lt;code&gt;computed&lt;/code&gt; par exemple) qui ne garde que les nombres pairs. Si vous faites &lt;code&gt;counter.set(2)&lt;/code&gt;, puis &lt;code&gt;counter.set(3)&lt;/code&gt;, le signal résultant ne verra jamais la valeur &lt;code&gt;2&lt;/code&gt;. En effet, si vous ne tirez que la valeur finale, le signal prendra uniquement en compte la dernière valeur, qui est &lt;code&gt;3&lt;/code&gt; (impair), et la filtrera. Ainsi, le résultat ne sera jamais celui que vous attendiez.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evenCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;evenCounter&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// undefined =&amp;gt; instead of 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;À l’inverse, si la dernière valeur est &lt;code&gt;4&lt;/code&gt;, vous aurez la fausse impression que votre opérateur fonctionne correctement.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;evenCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;isEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;evenCounter&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// 4 =&amp;gt; tricky result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Le piège de &lt;code&gt;take&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;De la même manière, avec le même signal &lt;code&gt;counter&lt;/code&gt; initialisé à &lt;code&gt;1&lt;/code&gt;, si vous effectuez &lt;code&gt;counter.set(2)&lt;/code&gt;, puis &lt;code&gt;counter.set(3)&lt;/code&gt;, puis &lt;code&gt;counter.set(4)&lt;/code&gt;, un opérateur &lt;code&gt;take(3)&lt;/code&gt; ne prendra en compte que la dernière valeur (&lt;code&gt;4&lt;/code&gt;). Il n’aura aucune idée que les valeurs &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;2&lt;/code&gt; et &lt;code&gt;3&lt;/code&gt; ont existé. Pour lui, c'est sa première (et unique) itération.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;En résumé&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Les &lt;strong&gt;signals&lt;/strong&gt; sont optimisés pour gérer l’&lt;strong&gt;état&lt;/strong&gt; de l’application (modèle Pull), tandis que &lt;strong&gt;RxJS&lt;/strong&gt; est parfait pour gérer des &lt;strong&gt;flux de données&lt;/strong&gt; (modèle Push).&lt;/p&gt;

&lt;p&gt;Avant d’utiliser l’un ou l’autre, posez-vous la question suivante :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Ai-je besoin de connaître l’historique des données, ou est-ce que seule la dernière valeur m’importe ?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si seule la dernière valeur compte, les signals sont faits pour vous. Sinon, un observable est probablement la meilleure solution.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>rxjs</category>
      <category>frontend</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
