<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Как избежать булевых значений в сигнатуре функции JavaScript 👩‍💻]]></title><description><![CDATA[<h2>Почему булевы значения в сигнатуре функции — это плохо?</h2>
<p dir="auto"><img src="/assets/uploads/files/1741851160328-qweqwe.jpg" alt="qweqwe.jpg" class=" img-fluid img-markdown" /></p>
<ol>
<li><strong>Снижение читаемости</strong><br />
Когда вы видите вызов функции, например:</li>
</ol>
<pre><code class="language-javascript">   processOrder(order, true);
</code></pre>
<p dir="auto">Сразу ли понятно, что делает этот <code>true</code>? Нет. Это может быть флаг для “экспресс-доставки”, “скидки” или ещё чего-то. Код становится менее понятным.</p>
<ol start="2">
<li>
<p dir="auto"><strong>Ограниченная масштабируемость</strong><br />
Если завтра нужно добавить третий режим, вам придётся заменять булево значение на что-то более сложное. Например, <code>null</code>, дополнительные флаги или даже переписывать логику.</p>
</li>
<li>
<p dir="auto"><strong>Увеличение когнитивной нагрузки</strong><br />
При чтении кода разработчик должен помнить, что означает каждый булевый флаг. Это особенно сложно в больших проектах.</p>
</li>
</ol>
<hr />
<h3>Альтернативные подходы</h3>
<p dir="auto">Вот несколько способов, как можно избежать булевых значений в сигнатуре функции:</p>
<ol>
<li>Использование объектов для конфигурации</li>
</ol>
<p dir="auto">Передавайте параметры в виде объекта, где каждое свойство имеет осмысленное название. Это делает код более читаемым и масштабируемым.</p>
<pre><code class="language-javascript">// Плохо
function processOrder(order, isExpress) {
  if (isExpress) {
    console.log("Обработка экспресс-заказа");
  } else {
    console.log("Обработка стандартного заказа");
  }
}

processOrder(order, true); // Что значит true?

// Хорошо
function processOrder(order, options) {
  if (options.isExpress) {
    console.log("Обработка экспресс-заказа");
  } else {
    console.log("Обработка стандартного заказа");
  }
}

processOrder(order, { isExpress: true }); // Ясно, что это экспресс-заказ
</code></pre>
<ol start="2">
<li>Использование перечислений (Enums)</li>
</ol>
<p dir="auto">Если у вас есть несколько фиксированных вариантов поведения, используйте перечисления. Это делает код более строгим и предсказуемым.</p>
<pre><code class="language-javascript">// Плохо
function setVisibility(element, isVisible) {
  if (isVisible) {
    element.style.display = "block";
  } else {
    element.style.display = "none";
  }
}

setVisibility(myElement, false); // Что значит false?

// Хорошо
const Visibility = {
  VISIBLE: "visible",
  HIDDEN: "hidden",
};

function setVisibility(element, visibility) {
  if (visibility === Visibility.VISIBLE) {
    element.style.display = "block";
  } else if (visibility === Visibility.HIDDEN) {
    element.style.display = "none";
  }
}

setVisibility(myElement, Visibility.HIDDEN); // Ясно, что скрываем элемент
</code></pre>
<ol start="3">
<li>Разделение функций</li>
</ol>
<p dir="auto">Если поведение функции сильно зависит от флага, возможно, стоит разделить её на две отдельные функции.</p>
<pre><code class="language-javascript">// Плохо
function calculatePrice(price, isDiscounted) {
  return isDiscounted ? price * 0.9 : price;
}

console.log(calculatePrice(100, true)); // Неочевидно

// Хорошо
function calculateFullPrice(price) {
  return price;
}

function calculateDiscountedPrice(price) {
  return price * 0.9;
}

console.log(calculateDiscountedPrice(100)); // Ясно, что считаем скидку
</code></pre>
<ol start="4">
<li>Использование классов или замыканий</li>
</ol>
<p dir="auto">Для более сложных случаев можно использовать классы или замыкания, чтобы инкапсулировать поведение.</p>
<pre><code class="language-javascript">// Плохо
function createLogger(isVerbose) {
  if (isVerbose) {
    console.log("Логирование включено");
  } else {
    console.log("Логирование отключено");
  }
}

createLogger(true); // Что значит true?

// Хорошо
class Logger {
  constructor(verbose) {
    this.verbose = verbose;
  }

  log(message) {
    if (this.verbose) {
      console.log(`[DEBUG] ${message}`);
    } else {
      console.log(message);
    }
  }
}

const verboseLogger = new Logger(true);
verboseLogger.log("Это сообщение будет с префиксом"); // Ясно, что логгер включен
</code></pre>
<hr />
<p dir="auto">Вот таблица, которая наглядно демонстрирует преимущества и недостатки различных подходов для избежания булевых значений в сигнатуре функции:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Подход</th>
<th>Преимущества</th>
<th>Недостатки</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Булевы значения</strong></td>
<td>- Простота реализации<br />- Быстрое написание кода</td>
<td>- Низкая читаемость<br />- Ограниченность в масштабировании<br />- Увеличение когнитивной нагрузки</td>
</tr>
<tr>
<td><strong>Объекты для конфигурации</strong></td>
<td>- Высокая читаемость<br />- Легко добавлять новые параметры<br />- Гибкость</td>
<td>- Может быть избыточным для простых задач<br />- Требует дополнительного времени на написание</td>
</tr>
<tr>
<td><strong>Перечисления (Enums)</strong></td>
<td>- Строгость типов<br />- Предсказуемость<br />- Четкая документация поведения</td>
<td>- Требует дополнительного кода<br />- Не всегда подходит для динамических случаев</td>
</tr>
<tr>
<td><strong>Разделение функций</strong></td>
<td>- Ясность намерений<br />- Простота использования<br />- Легко тестировать</td>
<td>- Увеличивает количество функций<br />- Может привести к дублированию кода</td>
</tr>
<tr>
<td><strong>Классы/замыкания</strong></td>
<td>- Инкапсуляция логики<br />- Гибкость<br />- Возможность повторного использования</td>
<td>- Может быть сложнее для новичков<br />- Увеличивает объем кода</td>
</tr>
</tbody>
</table>
<p dir="auto">Использование булевых значений в сигнатуре функции — это быстрое решение, которое часто приводит к проблемам в будущем. Вместо этого лучше использовать более явные подходы, такие как объекты для конфигурации, перечисления или разделение функций. Это сделает ваш код чище, понятнее и проще в поддержке.</p>
]]></description><link>https://forum.exlends.ru/topic/95/kak-izbezhat-bulevyh-znachenij-v-signature-funkcii-javascript</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 02:05:58 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/95.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Mar 2025 07:28:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Как избежать булевых значений в сигнатуре функции JavaScript 👩‍💻 on Tue, 09 Dec 2025 11:26:08 GMT]]></title><description><![CDATA[<p dir="auto">Прикольно, я бы добавил про это, для справки:</p>
<h3>RORO паттерн (Receive Object, Return Object)</h3>
<p dir="auto">В современном JS (ES6+) стандартом де-факто стало использование деструктуризации в параметрах. Это решает проблему элегантнее, чем просто замена на Enums или строковые константы.</p>
<p dir="auto">Вместо:</p>
<pre><code class="language-javascript">function setConfig(enableLogging, enableCache) { ... }
// Вызов: setConfig(true, false) — непонятно
</code></pre>
<p dir="auto">Лучше писать так:</p>
<pre><code class="language-javascript">function setConfig({ enableLogging = false, enableCache = true } = {}) { ... }

// Вызов:
setConfig({ 
  enableLogging: true, 
  enableCache: false 
});
</code></pre>
<p dir="auto">Это дает нам именованные аргументы “из коробки”, возможность задавать дефолтные значения прямо в сигнатуре и независимость от порядка аргументов.</p>
<p dir="auto"><strong>3. Контекст TypeScript</strong><br />
Если проект на TS, то булевы флаги становятся чуть менее страшными, так как IDE подсказывает имя аргумента, но объектный подход все равно выигрывает при рефакторинге. Расширить объект <code>options</code> новым полем проще, чем менять сигнатуру функции во всех местах вызова, добавляя 4-й или 5-й аргумент.</p>
]]></description><link>https://forum.exlends.ru/post/1048</link><guid isPermaLink="true">https://forum.exlends.ru/post/1048</guid><dc:creator><![CDATA[Dinozaur]]></dc:creator><pubDate>Tue, 09 Dec 2025 11:26:08 GMT</pubDate></item><item><title><![CDATA[Reply to Как избежать булевых значений в сигнатуре функции JavaScript 👩‍💻 on Tue, 09 Dec 2025 11:10:03 GMT]]></title><description><![CDATA[<p dir="auto">да, вот было бы как в пайтоне именованные аргументы, жилось бы лучше …</p>
]]></description><link>https://forum.exlends.ru/post/1047</link><guid isPermaLink="true">https://forum.exlends.ru/post/1047</guid><dc:creator><![CDATA[Aladdin]]></dc:creator><pubDate>Tue, 09 Dec 2025 11:10:03 GMT</pubDate></item></channel></rss>