Перейти к содержанию

Явная и неявная типизация

Помимо разделения на статическую/динамическую и сильную/слабую типизацию, языки программирования разделяются на языки с явной и неявной типизацией.

Явная типизация

Язык с явной типизацией (explicit typing) предполагает, что указание принадлежности к конкретному типу при объявлении языковых элементов возлагается на разработчика.

Явная типизация за счет наличия типизированных параметров и возвращаемого типа у функций и методов, а также указания типов при объявлении переменных, свойств и полей, делает код более понятным (читабельным) и позволяет разработчикам, не знакомым с кодом, быстрее включатся в процесс разработки, тем самым снижая время на модификацию программы.

Явная типизация обязывает явно указывать типы и тем самым способствует развитию у разработчика навыков, необходимых при проектировании архитектуры программ.

В львиной доле языков с явной типизацией существует возможность указывать типы неявно.

Рассмотрим пример кода демонстрирующего явную типизацию.

class Controller {
  public check(eggs: IEgg[]): boolean {
    const isValid: boolean = Validator.valid(eggs)

    return isValid
  }
}

Класс Controller содержит метод check, который имеет один обязательный параметр eggs c типом IEgg[ ] и возвращающий тип boolean. Если бы не явно указанные типы параметров, то разработчикам пришлось бы только гадать с чем именно им предстоит работать. Это же относится и к возвращаемому типу.

Результатом выполнения Validator.valid( eggs ) внутри метода check является возвращаемое из функции значение типа boolean. Если бы при объявлении переменной isValid тип boolean не был бы указан явно, то было бы сильно сложнее догадаться то же возвращает метод valid.

Разработчику впервые увидевшего этот код или тому который имел с ним дело очень давно, не составит труда разобраться за что отвечает данный участок кода.

К языкам с явной типизацией относятся С++, С# и многие другие.

Неявная типизация

Язык с неявной типизацией (implicit typing) при объявлении языковых элементов не требует от разработчика указания принадлежности к конкретному типу данных и возлагает определение типов на компилятор или интерпретатор.

За основу примера неявной типизации возьмем код из предыдущего примера и лишим его всей атрибутики, связанной с явной типизации.

class Controller {
  check(eggs) {
    const isValid = Validator.valid(eggs)

    return isValid
  }
}

Этот код стал занимать меньше места, что является одним из нескольких доводов, которые можно услышать в пользу языков с неявной типизацией. Но на самом деле это не так.

На практике считается хорошим тоном при объявлении языковых элементов уделять особое внимание именованию. Ведь именно от выбора названия будет зависеть то время, которое уйдет у программиста на понимание участка кода при отладке, рефакторинге или модернизации.

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

class EggController {
  checkEgg(eggAll) {
    const isEggValid = EggValidator.qualityEggValid(eggAll)

    return isEggValid
  }
}

Именно по этой причине правило именования распространяется и на языки с явной типизацией.

А тот факт, что неявная типизация позволяет реализовывать несложные алгоритмы с меньшими временными затратами, разбивается о возможность всех современных языков с явной типизацией с помощью вывода типов указывать тип неявно.

class EggController {
  public checkEgg(eggAll: IEgg[]): boolean {
    const isEggValid: boolean = EggValidator.qualityEggValid(eggAll)

    return isEggValid
  }
}

К языкам с неявной типизацией относятся такие языки, как JavaScript, PHP и другие.

Итог

  • Явная типизация возлагает указания типов на разработчика, развивая у него навыки, требующиеся при проектировании программ, и делает код более читабельным.
  • Языки с явной типизацией за счет вывода типов имеют возможность указывать типы неявно.
  • Неявная типизация возлагает определение типа на компилятор или интерпретатор.