Как написать суперчитаемый код

В прошлый раз, когда я написал статью 7 Bad Code Smells In Typescript, она получила много внимания и похвалы. Поэтому я думаю, что многие хотят узнать об этом больше и я решил написать об этом еще одну статью.

В этой статье я не буду повторять предыдущие плохие запахи кода. Сегодня мы обсудим еще 5 концепций чистого кода в Typescript.

1. Функции должны делать одну вещь

Если функции выполняют несколько функций, их сложнее изменить, протестировать и реорганизовать.

Плохая практика:

function updateDeprecatedDependencies(dependicies: Dependency[]) {
  dependicies.forEach((dependency) => {
    const dependencyVersion = getDependencyVersion(dependency);
    if (dependencyVersion.isDeprecated()) {
      upgradeDependency(dependency);
    }
  })
}

Сделайте это вместо этого:

function updateDeprecatedDependencies(dependicies: Dependency[]) {
  dependicies.filter(isDeprecatedDependency).forEach(upgradeDependency);
}

function isDeprecatedDependency(dependency: Dependency) {
  const dependencyVersion = getDependencyVersion(dependency);
  return dependencyVersion.isDeprecated();
}

2. Используйте enum для документирования намерения

Перечисления могут помочь вам задокументировать цель вашего кода.

Плохая практика:

const MOBILE_OS= {
  ANDROID: 'android',
  IOS: 'iOS',
}

reactNative.run(MOBILE_OS.ANDROID);

class ReactNative {
  // declaration of React Native
  run(mobileOS) {
    switch (mobileOS) {
      case MOBILE.ANDROID:
        // some logic to be executed 
      case MOBILE.IOS:
        // some logic to be executed
    }
  }
}

Сделайте это вместо этого:

enum MOBILE_OS {
  ANDROID,
  IOS,
}

reactNative.run(MOBILE_OS.ANDROID);

class ReactNative {
  // declaration of ReactNative
  run(mobileOS) {
    switch (mobileOS) {
      case MOBILE.ANDROID:
        // some logic to be executed 
      case MOBILE.IOS:
        // some logic to be executed
    }
  }
}

3. Не игнорируйте пойманные ошибки

Если вы заключаете свой код в try/catch, это означает, что вы думаете, что может быть ошибка, и поэтому вы должны зарегистрировать или что-то сделать с ошибкой.

Плохая практика:

try {
  functionThatMightThrow();
} catch (error) {
  console.log(error);
}

// or even worse

try {
  functionThatMightThrow();
} catch (error) {
  // ignore error
}

Сделайте это вместо этого:

import { logger } from './logging'

try {
  functionThatMightThrow();
} catch (error) {
  logger.log(error);
}

4. Удалите неиспользуемый код

Если у вас есть неиспользуемый код, избавьтесь от него! Он будет сохранен в вашей истории версий, если он вам все еще нужен.

function unusedFunction(param: string) {
  // ...
}

function newFunction(param: string) {
  // ...
}

const result = newFunction();

Сделайте это вместо этого:

function newFunction(param: string) {
  // ...
}

const result = newFunction();

5. тип и интерфейс

Используйте type, если вам нужен union или intersection. Используйте interface, если вам нужно extends или implements.

Если вам интересно, вы можете прочитать больше Interfaces vs Types.

Плохая практика:

interface FrontendConfig {
  // ...
}

interface BackendConfig {
  // ...
}

interface Config {
  // ...
}

//...

type Settings = {
  // ...
}

Сделайте это вместо этого:

type FrontendConfig = {
  // ...
}

type BackendConfig = {
  // ...
}

type Config  = FrontendConfig | BackendConfig;

// ...

interface Settings {
  // ...
}

class FrontendSettings implements Settings {
  // ...
}

class BackendSettings implements Settings {
  // ...
}

Заключение

О чистом коде можно говорить много, одной статьи мало. Если вам интересно, вы также можете прочитать больше 7 Bad Code Smells In Typescript.

Спасибо за прочтение, надеюсь, эта статья оказалась вам полезной. Удачного кодирования!

Ресурсы