Вот мои 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”