..и почему я до сих пор предпочитаю Java для некоторых своих проектов
Я прочитал много статей о том, почему Python — лучший язык программирования, и не могу отрицать, что согласен с большей частью их рассуждений. Тем не менее, есть некоторые функции, которых, на мой взгляд, в Python не хватает.
Хотя я всегда использую Python при написании программ машинного обучения, я часто прибегаю к Java, когда работаю над более крупными проектами, связанными с объектно-ориентированным программированием. Python великолепен, когда дело доходит до расширений библиотек, но это не всегда самое главное. Есть функции, которые никакая библиотека не заменит.
Интерфейсы
Одним из важнейших элементов ООП являются интерфейсы. С их помощью можно указать общую структуру некоторых классов. Например, если вы создаете игру с различными животными, вам может понадобиться универсальный интерфейс Animal, в котором вы можете указать, какие методы должны реализовывать все классы животных.
В Python лучшее, что мы можем сделать, чтобы воспроизвести это поведение, — это использовать классы с пустыми методами. Например:
Class Animal():
def walk(distance):
pass
def sound():
pass
Затем вы можете создать класс Dog, который наследует этот «интерфейс» и реализует walk и sound. Тем не менее, создание класса, не отвечающего всем требованиям, не вызовет никакой ошибки. Так вы узнаете свою ошибку только тогда, когда программа неожиданно вылетит.
Документация
Это только личное предпочтение, но я считаю, что документирование кода Python действительно неясно. В Java есть инструмент Javadoc, который позволяет очень просто создавать отличную документацию. Все, что вам нужно сделать, это задокументировать свой код с использованием (действительно интуитивно понятного) синтаксиса, а затем запустить однострочную команду:
javadoc -d documentationFolder programFolder
С другой стороны, в Python вам необходимо установить пользовательскую библиотеку (Sphinx) для создания документации внутри HTML-файлов. Затем, после того, как вы написали документацию, вам нужно настроить Sphinx, заполнив все необходимые поля, и только после этого вы можете запустить make html, чтобы получить документацию.
Это намного сложнее, чем Java! В результате я трачу слишком много времени на документирование (поэтому большую часть времени я его не пишу).
Частные переменные
Одной из характеристик Python является то, что пользователь может получить доступ ко всем методам и переменным каждого класса. Нет такой вещи, как частные методы/переменные. Это рациональный выбор дизайна, но я все же предпочитаю скрывать от пользователя некоторые элементы моих классов.
На самом деле, использование закрытых переменных упрощает обеспечение того, чтобы мой класс не сломался, когда кто-то изменит несколько значений.
По моему опыту, предоставление слишком большой свободы пользователю часто приводит к катастрофе. Вы определенно не хотите, чтобы кто-то изменил значение числа пи, которое вы используете для вычисления площади круга!
Примечание. В Python, если имя переменной начинается с подчеркивания, она считается (по соглашению) частной. Тем не менее, я предпочитаю иметь возможность сделать переменные недоступными для пользователя, как это можно сделать в Java.
Создание пакетов
В Java можно раскидать программу по нескольким папкам, и они все равно будут видеть друг друга (нужно только указать правильный путь). Это отлично подходит для организации больших проектов. Каждый пакет (папка) будет содержать связанные классы, что ускорит поиск нужного, когда вы захотите его изменить.
В Python нет простого способа добиться того же. Вы можете получить доступ к программе только из родительской папки. Например, если файлы хранятся в разных папках:
SourceFolder
FolderA
programA.py
FolderB
programB.py
Вы не можете получить доступ к programB.py из programA.py . Это очень ограничивает, потому что становится намного сложнее поддерживать чистоту вашего проекта.
Перегрузка функций
Это единственная функция, которую я бы хотел добавить в Python. Во многих других языках вы можете создать несколько функций с одним и тем же именем, но с разными параметрами. Тогда компилятор распознает, какой из них применить, в зависимости от параметров, которые дает пользователь.
К сожалению, это недоступно в Python, вероятно, из-за того, что Python динамически типизирован (поэтому мы не можем отличить две функции только по типу их параметров).
Тем не менее, отсутствие возможности перегружать функции является большим недостатком. Например, вы можете захотеть создать несколько конструкторов для одного класса, но это возможно только в таких языках, как Java.
Вывод
Python — отличный язык программирования, особенно для науки о данных и машинного обучения из-за множества доступных библиотек. Тем не менее, вот некоторые функции, которые сделают его лучше:
- интерфейсы
- частные переменные и методы
- лучшая документация
- доступ к модулям, хранящимся в разных папках
- перегрузка функций
Спасибо, что дочитали до конца! Если у вас другое мнение, дайте мне знать в комментариях.
Дополнительные материалы на plainenglish.io