Программирование * на * языке против написания кода на C на Ruby


10

Code Complete утверждает, что вы должны использовать код на языке, а не на коде в нем. Под этим они подразумевают

Не ограничивайте свое мышление только теми понятиями, которые автоматически поддерживаются вашим языком. Лучшие программисты думают о том, что они хотят делать, а затем они оценивают, как достичь своих целей с помощью инструментов программирования, имеющихся в их распоряжении. (глава 34.4)

Разве это не приводит к использованию одного стиля программирования на каждом языке вне зависимости от его сильных и слабых сторон?

Или, чтобы поставить вопрос в более ответственном формате:

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


5
+1 хороший вопрос. На данный момент я могу писать на Perl на полдюжине разных языков.
— Дэн Рэй

@ Дэн Рэй - странно! Я всегда пишу C на Perl.
— Джеймс Андерсон

Ответы:


7

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

Этот подход называется языковым программированием . Существует много способов эффективной реализации специфичных для предметной области языков , и это особенно актуальная тема для сообщества Ruby.


1
Сообщество Haskell также охватывает языки, специфичные для предметной области, и язык программирования Haskell особенно подходит для их реализации.
— tdammers

Рассматривается ли написание DSL как специально разработанная система сценариев на основе встроенного языка, такого как Lua или Tkl? Если да, то как вы справляетесь с недостатками, например, Lua?
— Бастиб

@Paperflyer, в некоторых случаях имеет смысл реализовывать языки поверх чего-то вроде Lua (особенно если это Metalua), но легче написать подходящий компилятор для большинства типичных DSL.
— SK-logic

@tdammers, да, Haskell и Scala - все о DSL. Но я из темной стороны Силы: мой предпочтительный подход - метапрограммирование. Я считаю, что специальные интерпретаторы почти всегда уступают компиляторам.
— SK-logic

2
@tdammers, DSL, реализованный поверх функций высокого порядка, фактически является специальным интерпретатором. Вы не можете расширять синтаксис Haskell так же, как, скажем, Lisp. Даже с шаблоном Haskell. Это совершенно другой (и, я бы сказал, ограниченный) способ реализации DSL. Во многих случаях это нормально, но для чего-то действительно сложного это приводит к совершенно нечитаемым реализациям, в то время как многоступенчатое метапрограммирование просто тривиально, независимо от того, насколько большим и чуждым является ваш DSL.
— SK-logic

2

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

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

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

Например, изучение Haskell значительно улучшило мои навыки использования функций более высокого порядка. Теперь, когда программирую на c #, я использую различные IEnumerableметоды, такие как Selectчаще, так как использование этих методов приводит к более чистому коду, чем запись для циклов. Я также склонен использовать функции передачи и использования (то есть Func<int, int>) чаще из-за моего опыта в Haskell. Мое использование наследования упало из-за этого, и в большинстве случаев результатом является более простой код.

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

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


0

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

Дело в том , что хорошие программисты не имеют на языке. Цитата из книги говорит о «инструментах программирования в их распоряжении» - это означает, что если вы знаете Perl и Java, то, возможно, вам следует использовать Perl для этой быстрой манипуляции со строками. Языки программирования - это не ограничивающие нас рамки, а инструменты, которые мы используем для решения проблем. Это (IMO) то, что код завершения. Не пишите код в окне языка программирования / среды, поместите лучшее решение в лучший язык программирования / среду для вас, вашей проблемы и вашего решения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.