Рубрики
Без рубрики

Как написать хорошую функцию?

Вот мои 3 вещи, чтобы посмотреть во время написания хорошей функции. Примеры кода приведены в PY … Помечено Python, CodeNewie, CodeQuality, JavaScript.

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

Не доверяйте вводам

Посмотрите на код ниже и подумайте, что может пойти не так.

def process_date(str_date):
    """
       This takes date in format dd/mm/yyyy and returns
       a dict of format {'y':2000,'m':10,'d':19 } as output
    """
    d,m,y = str_date.split('/')
    value = {'y':y,'m':m,'d':d}
    return value

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

process_date (str_date/20/2000) .

Тогда выход функции будет:

{‘y’: 2000, «M»: 20, «D»: 10}

Функция возвращает вывод, поэтому все, кажется, работает правильно? Но есть логическая ошибка. Месяцы никогда не могут быть больше 12. То же самое касается дней и лет. Помимо того, что, если пользователь передал отрицательные значения -1/--1/-1 ? Кроме того, что если пользователь предоставил пустую строку?

Здесь мы допустили ошибку доверять вводам Отказ Мы должны Никогда доверять вводам. Будьте скептически относиться к параметрам и подумайте о краевых случаях. Обязательно продемонстрируйте свой вклад, прежде чем выполнить любые вычисления на них.

Не удалось громко и четко

Что делать, если вы измените формат даты? От 10/20/2000 к 10-20-2000 Отказ Это полностью нарушит ваш код.

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

regex_date_format = "^\d{1,2}/\d{1,2}/\d{4}$"
if not re.match(regex_date_format, date_str):
    raise ValueError(
        f"str_date: {str_date} should be of the format dd/mm/yyyy "
    )

Кроме того, большую часть времени мы склонны просто вернуться Нет Если мы получим какую-либо ошибку.

if error:
    return None

if error:
    return None

some code

return result

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

Быть последовательным с типом возврата

Одна вещь, которую мне нравится про статически напечатанным языком, это их согласованность. Если вы используете функцию, то вы будете знать, если это вернет Массив или обдумывать или Строка и т.п. Это позволяет нам обрабатывать вывод некоторыми последовательными способами, а также избежать путаницы и ошибок в программе.

def return_something( input ):
    if error:
        return 'Error connecting to the server'
    code

    return {"data":"Hello world"}

Предположим, что кто-то использует эту функцию следующим образом:

response = return_something(inp)
data = response['data']

Здесь код перерывается, если при подключении к серверу есть ошибка. Правильный способ проверки это будет

response = return_something(inp)
if isinstance(response, str):
    handle_error
data = response['data']

Другой способ написать ту же функцию:

def return_something( input ):
    if error:
        return {"error": 'Error connecting to the server' , "data": "" }
    code

    return {"data":"Hello world", "error": "" }

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

response = return_something(inp)
data = response['data']
error = response['error']

if error:
   handle_error

if data:
   do_something

Это также увеличивает читаемость кода. В первом примере можно было удивляться, Почему мы обрабатываем ошибку, если экземпляр является строкой Отказ Принимая во внимание, что во второй реализации ясно, что любой ответ содержит два поля данные и ошибка И если мы получим какую-либо ошибку, мы можем сделать некоторую обработку ошибок.

Пожалуйста, предоставьте свой отзыв

Оригинал: “https://dev.to/igaurab/how-to-write-a-good-function-464d”