Завоевывая сложность, Eckel на Java и Python и [закрытой] теории блока

8
задан Warren P 25 June 2010 в 14:51
поделиться

5 ответов

Я думаю, Брюс следовал примеру Фреда Брукса, который говорит о сложности в своем эссе «Нет серебра» Пуля », и описывает два типа. Первый тип присущ проблеме, которую вы пытаетесь решить, которую он называет существенной сложностью и остается неизменной независимо от того, какой язык вы используете. Во-вторых, сложность, которую добавляют инструменты и языки, которые мы используем - все, о чем вам нужно подумать, напрямую не способствует решению проблемы. По этому показателю Java намного сложнее Python. Самый простой пример - каноническая программа Hello World.В Python (и некоторых других языках) это одна строка:

print "hello World!"

В Java это

class HelloWorld {
  static public void main( String args[] ) {
    System.out.println( "Hello World!" );
  }
}

, большая часть которой не имеет ничего общего с задачей печати «Hello World» и по сути является шумом.

ИМХО, есть несколько факторов, которые усложняют Java по сравнению с другими языками, такими как Python.

1) все должно быть в классе. Это вынуждает вас использовать парадигму объектно-ориентированного программирования, даже когда она не подходит, как в примере выше, и добавлять множество ненужных определений классов boilplate.

2) Несмотря на то, что он заставляет вас использовать классы, он не полностью объектно-ориентирован. Под этим я подразумеваю, что не все является объектом, например, примитивные типы и методы. В python вы можете создавать подклассы всех встроенных типов и передавать функции и методы, как любой другой объект.

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

3) Java заставляет вас помещать объявления типов везде, что добавляет много беспорядка без добавления полезной информации. Это не просто проблема статики и динамики - существуют языки со статической типизацией, такие как Scala, которые могут определять типы в 90% случаев и устранять весь шум.

4) Хотя Java вынуждает вас использовать статическую типизацию, многие (возможно, большинство) реальных Java-программ частично используют динамическую проверку типов.Каждый раз, когда вы выполняете приведение объекта к определенному типу, вы выполняете динамическую проверку типа - до того, как в Java 5 были добавлены дженерики, это означало, например, каждый раз, когда вы использовали класс контейнера. Даже при использовании универсальных контейнеров некоторая их проверка типов выполняется во время выполнения. Также каждый раз, когда у вас есть XML-файл с именами классов или методов в нем где-то в коде, он должен выполнить проверку динамического типа, чтобы убедиться, что он соответствует реальному классу. Так много программ Java все еще несут в себе предполагаемые «опасности» динамической типизации, но со всей многословностью, которую вынуждает добавлять статическая типизация Java.

Я мог бы продолжить (и часто так и поступаю), но остановлюсь на этом замечанием, что я видел много кода, который проще, чище и менее сложный в Python, чем в Java, но не наоборот. Если кто-то может указать мне на что-нибудь, я бы с удовольствием это увидел.

5
ответ дан 5 December 2019 в 08:50
поделиться

Bruce Eckel: Говорят, что вы можете держать семь плюс-минус две части информации в вашем сознании. Я не могу вспомнить, как открывать файлы в Java.

Я могу:

new FileInputStream(filename);

Я написал об этом главы. Я делал это кучу раз, но это слишком много шагов. И когда я действительно анализирую это, я понимаю, что это просто глупые дизайнерские решения, которые они приняли. Даже если бы они настаивали на использовании шаблона Decorator в java.io, они должны были иметь удобный конструктор для простого открытия файлов.

Это решается в считанные минуты написанием такого утилитного метода с простым api. И так оно и было. Если это самая сильная критика, которая может быть направлена на Java, то я остаюсь явно не впечатлен.

5
ответ дан 5 December 2019 в 08:50
поделиться

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

Почти каждый язык основан на победе над сложностью. Нет другой цели, которую стоило бы преследовать. Ассемблер, C++, Java, Python и практически каждый другой существующий язык основан на упрощении программирования.

Как Python справляется со сложностью?

Python определенно имеет один из самых интуитивных синтаксисов среди всех языков IMHO. Его использование блочных отступов решает множество проблем, и большая его часть настолько близка к простому языку, насколько это возможно. M = [x for x in S if x % 2 == 0] - хороший пример, бесчисленное множество других примеров можно найти в любой книге по python.

Является ли более короткий и лаконичный синтаксис Python ключевым способом победить сложность?

Я считаю, что простой синтаксис Python - это хороший способ победить сложность. Однако это единственный определенный ответ, который я могу дать на ваш другой вопрос:

Что вы думаете о победе над сложностью?

Вы задаете вопрос, который является ядром теории языка и охватывает битвы, которые, вероятно, будут бушевать до конца времен. статическая vs динамическая типизация - один из таких споров. Есть еще куча других разработок в теории языка, таких как процедурные языки против OO против функциональных языков и аспектно-ориентированное программирование, которые пытаются упростить программирование. Посмотрите на последнюю (или любую) версию языка, чтобы увидеть примеры того, что делается для "победы над сложностью". Однозначного ответа никогда не будет, а полное обсуждение каждого подхода займет несколько месяцев и, вероятно, полностью изменится к тому времени, когда вы закончите. :D

.
4
ответ дан 5 December 2019 в 08:50
поделиться

Для меня переход с Java на Python был большой победой. Я могу писать код быстрее, с теми же или меньшими ошибками, и легче его модифицировать. Код также остается гораздо более читабельным, поэтому, когда я возвращаюсь к нему через пару месяцев, я могу быстрее понять, что он делает (и переписать его без особых проблем, если не получается).

Java, будучи сильно типизированной, требует большой предварительной работы по разработке и поддержке правильных определений типов. Если вы объявите переменную как int, а потом решите, что она должна быть float, вам придется менять этот тип во всей программе. Вы храните это значение в массиве? Вам нужно будет изменить и объявление этого типа. Решили рефакторить несколько классов, чтобы они имели общий интерфейс? Вам придется изменить определения функций во всей вашей кодовой базе, чтобы справиться с этим. Если у вас особенно сложный дизайн, вам придется решать множество подобных проблем.

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

3
ответ дан 5 December 2019 в 08:50
поделиться

Получил пятерку в моем курсе "ООП с Java" в прошлом семестре и несколько лет самоучился на Python, а также был заинтересован в программировании в целом и написал несколько K строк. на обоих языках (не считая комментариев), включая лексер / синтаксический анализатор Джека на Python (и то, что эквивалент выполняется - или нет - на Java моими соотечественниками), я думаю, что у меня достаточно опыта, чтобы в любом случае стоить хотя бы несколько центов. Или нет, но теперь, когда я закончил гудеть в свой рог , вы можете решить для себя;)

Прежде всего, я полностью согласен с тем, что программирование - это снижение сложности. Я также согласен с тем, что Java не очень помогает в уменьшении сложности.

Например, чтобы получить ввод пользователя из командной строки?

Scanner input = new Scanner (new BufferedReader (System.in)); (Я думаю? И прошло всего 2 или 3 месяца с тех пор, как я использовал это)

Python - это raw_input () , а в 3.0 он просто input ()

Как вы читаете из файла в Java? Честно говоря, не знаю. Мы мало что делали, и это было хуже, чем Scanner. Как уже упоминалось, Java по сложности превосходит любой другой известный мне реальный язык, но не настолько плох, как язык « тот ».

Я думаю, что основная проблема сложности Java обнаруживается в примере, который меритон использует для защиты Java. Вместо того, чтобы импортировать потрясающие API-интерфейсы сообщества и реализовывать их как часть языка, Java имеет «базовый» язык, а API-интерфейсы являются лишь его расширением.Что мне интересно, так это изобилие инструментов, которые Java имеет для создания API и документации для указанных API. Я имею в виду, что вы пишете свой код, добавляете некоторые определенные комментарии и (по крайней мере, в Eclipse) выбираете элемент внутри меню, и вы сгенерировали несколько красивых javadocs. Несмотря на то, что иметь такую ​​прекрасную документацию замечательно, я задаюсь вопросом, не возникла ли она на самом деле из-за необходимости, потому что просмотр программы не дает вам подсказки , что делает Java. Сканер? Буферизованный читатель? Какого черта ?? Есть слои и уровни дополнительной сложности, которые можно (и некоторые утверждают, что следует) абстрагировать. Черт возьми, я могу открыть и прочитать файл на сборке с меньшими усилиями, чем Java. Конечно, сравнение нескольких строк на самом деле довольно тривиально и бесполезно, но дело в том, что Java часто вносит сложность, а не решает ее.

Вот основная причина, по которой я считаю, что у Python есть преимущество: полезные типы / функции встроены в язык, и они, как правило, очень хорошо названы (и, по крайней мере, если они не очень удачно названы, они хоть намек есть).

Например, допустим, я хочу открыть файл, разделенный запятыми (без использования дополнительных API или импорта), и сохранить каждый элемент в общей коллекции.

В Python (2.6+ или 2.5 с импортом из future ) это буквально две строки:

with open('myfile.csv') as f:
    print f.read().split(',')

done.

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

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

Но когда дело доходит до этого, большинство людей могут принять посмотрите на программу Python и поймите, что происходит. От начинающих программистов до очень продвинутых программистов можно будет понять программу и цель, взглянув на нее. Черт возьми, я только что написал плагин для Bazaar, сочетая чтение (плохой) документации и чтение кода встроенных функций Bazaar. Это потребовало относительно небольших усилий, и у них даже есть несколько настраиваемых определений. То же самое и для некоторых скриптов golly . При кодировании материала в моем классе Java я также смог понять некоторые другие классы . Однако я думаю, что у меня было серьезное преимущество в этом классе, потому что концепции Java очень похожи на концепции Python. Или наоборот, как вам удобнее. (Или они оба похожи на концепции Lisp;)

Я думаю, честно говоря, я думаю, что сложность - это просто кривая обучения. У Python очень неглубокая кривая обучения, при этом мощность является обратной функцией кривой обучения. У Java более крутая кривая обучения, с кривой мощности, имеющей линейную (2x? 3x?) Зависимость. Я думаю, что после того, как вы изучите язык и основные концепции, сложность будет снижена почти до нуля для обоих языков.

2
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: