Как избежать путаницы при использовании скриптового языка? - PullRequest
2 голосов
/ 22 июня 2011

Раньше я писал очень сильный язык шрифтов, например, Java.Мне нужно сообщить компилятору, какой тип переменной я буду вставлять ... например ...

 public static void sayHello(String aName)

Я могу гарантировать, что пользователь передаст мне строку ... Но если я используюphp, я могу это сделать ...

 function sayHello($aName)

Я все еще могу назвать sayHello, но я не знаю, какой тип param ...... Я могу позволить названию более информативным, как это:

 function sayHelloWithString($aName)

Но я не могу остановить передачу пользователя в int мне ..... пользователь все еще может передать int мне ... ... это может вызвать много ошибок.... Как я могу остановить это?какие-нибудь идеи или опыт поделились?Спасибо.

Ответы [ 8 ]

5 голосов
/ 22 июня 2011

Как насчет не , мешающего пользователю передавать int?

В php вы можете проверить is_string, но, конечно, вы пропустите объекты, которые имеют__toString set или неявное преобразование чисел в строки.

Если вы должны заставить свою программу плакать от боли, когда разработчик пытается что-то другое, вы можете указать тип позже.версии PHP (то есть function foo(ObjectType $bar)...) *

В большинстве свободно набираемых языков вы хотите настроить запасные варианты для основных типов:

  • число
  • array
  • string
  • универсальный объект

Будьте либеральны в том, что вы принимаете, будьте строгими в том, что вы отправляете.

* Примитивные типыне поддерживается для подсказок типа

2 голосов
/ 22 июня 2011

Есть несколько способов справиться с этим ...

  1. Используйте IDE, которая поддерживает докблоки.Это относится к проверке типов перед выполнением при написании кода.
  2. Используйте проверку типов в пределах вашей функции Это помогает только при проверке типа во время выполнения, и вы не узнаете при написании кода.
  3. В зависимости от типа вы можете использовать встроенный тип подсказки.Однако это работает только для нескалярных значений, в частности array и имени класса.

1 - Чтобы реализовать # 1 с помощью хорошей IDE, вы можете заблокировать свою функцию следующим образом:

/**
 * Say hello to someone.
 *
 * @param string $aName
 **/
public function sayHello($aName) {

2 - Для реализации # 2 используйте методы is_.

public function sayHello($aName) {
    if (!is_string($aName)) {
        throw new ArgumentException("Type not correct.");
    }
    // Normal execution

3 - Вы не можете сделать это с помощью вашего метода выше, но что-то вроде этого .. ВидТак же, как # 2, кроме выдает бросаемую фатальную ошибку, а не ArgumentException.

public function manipulateArray(array $anArray) {

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

Использование хорошей IDE (я рекомендую phpStorm тысячу разболее) вы можете и должны использовать DocBlocks везде, где можете для всех своих классов.Это не только поможет при написании API и нормального кода, но вы также можете использовать его для документирования своего кода. Что если вам нужно взглянуть на код через 6 месяцев, скорее всего, вы не запомните его на 100% :-)

Кроме того, с docblocks можно сделать гораздо больше, чем просто определить типы параметров, посмотрите это.

2 голосов
/ 22 июня 2011

Вы можете проверить, является ли то, что они передали, строкой, используя: http://php.net/manual/en/function.is-string.php

Затем предоставьте соответствующую обработку ошибок.

1 голос
/ 22 июня 2011

В PHP вы можете проверить, является ли переданная переменная строкой, используя функцию is_string:

 <?php 
 if (is_string($aName)) {
     echo "Yes";
 } else {
     echo "No";
 }
 ?>

Надеюсь, это поможет.

1 голос
/ 22 июня 2011
function sayHello($aName) {
  if (is_string($aName)) {
    //string OK!
  } else {
    echo "sayHello() only takes strings!";
  }
}
0 голосов
/ 22 июня 2011

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

Иногда помогают соглашения об именах. Например, мы унаследовали от старой доброй традиции Фортрана, что имена переменных int должны начинаться с i, j, k, l, m, n. И это соглашение теперь используется по крайней мере для индексов.

0 голосов
/ 22 июня 2011

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

Что касается указания пользователю типа, который вы хотите, я обычно добавляю его в имя переменной:

function sayHello($aNameStr)
function addItems($itemList)
...etc...

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

0 голосов
/ 22 июня 2011

Или альтернативно / дополнительно используйте приведение типов для преобразования переменной в требуемый тип

http://us3.php.net/manual/en/language.types.type-juggling.php

...