Что такое чистый способ (или шаблон) для проверки параметров функции? - PullRequest
9 голосов
/ 21 апреля 2011

Существует ли какой-либо шаблон проектирования или простой способ проверки параметров функции / метода (по допустимым значениям)?

В настоящее время множество исходного кода в моих функциях состоит из этих проверок параметров (пустые строки, недопустимыесимволы, существующий идентификатор, ...) и, при необходимости, это немного уродливо и запутывает «реальный» код функции.Как правило, мой код выглядит примерно так:

def my_function(p1,p2,p3,p4):
    #check parameters
    if p1 == ''
       raise InvalidArgError('p1 can not be empty')
    if p1 not in valid_list:
       raise InvalidArgError('p1 does not exist')
    if p2 < 0:
       raise InvalidArgError('p2 can not be negative')
    ...

    #finally do something
    p = p2+p3

Для решения я имею в виду декораторы в Python.
Я использую Python, хотя я предполагаюхорошее решение не зависит от языка.

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

Единственная вещь, не зависящая от языка, которую я могу себе представить на данный момент, это некий кодовый контракт, поэтому вы можете делать такие вещи, как:

func foo(param1, param2)
{
    Contract.NotNull(param1)
    Contract.IsIn(0, 100, param2)
}

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

Обновление

Microsoft работает над реализацией , и существует реализация Java .

1 голос
/ 21 апреля 2011

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

void drawRectangle(int length, int width) {
    if (isValidLength(length) == false || isValidWidth(width) == false) {
        // log about invalid argument so that it can be easily traced for debugging
        return;
    }

    // remaining  code
}

boolean isValidLength(int length) {
    if (value < 0 || value > 100) {
        return false;
    }

    return true;
}

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

0 голосов
/ 21 апреля 2011

Наверное, не совсем, не одна форма способ сделать это.

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

def setpoint(x, y):
    # checking for out of bounds
    if x < 0 or x >= maxwidth: return false
    if y < 0 or y >= maxheight: return false

    # start function
    map[x][y] = true

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

...