Programowanie * w * języku a pisanie kodu C w Ruby

10

Code Complete stanowi, że powinieneś rozprowadzać kod w języku, a nie w nim. Przez to mają na myśli

Nie ograniczaj myślenia programistycznego tylko do pojęć obsługiwanych automatycznie przez Twój język. Najlepsi programiści myślą o tym, co chcą robić, a następnie oceniają, jak osiągnąć swoje cele, korzystając z narzędzi programistycznych, którymi dysponują. (rozdział 34.4)

Czy nie prowadzi to do stosowania jednego stylu programowania w każdym języku, niezależnie od mocnych i słabych stron danego języka?

Lub, aby postawić pytanie w bardziej zrozumiałym formacie:

Czy zaproponowałbyś, abyś starał się jak najdokładniej zakodować swój problem przy pomocy szczegółów swojego języka, czy raczej raczej ogólnie wyszukać najbardziej eleganckie rozwiązanie, nawet jeśli oznacza to, że musisz wdrożyć możliwie niezręczne konstrukcje, które nie istnieją natywnie w swoim języku?

bastibe
źródło
5
+1 dobre pytanie. W tym momencie mogę pisać w Perlu w kilku różnych językach.
Dan Ray
@Dan Ray - dziwne! Zawsze piszę C w Perlu.
James Anderson
Zobacz także: Programowanie „w” języku kontra programowanie ”w„ język Jona Skeeta
Arseni Mourzenko

Odpowiedzi:

7

Istnieje jeszcze lepsze podejście: w ogóle zapomnij o żałosnym, stałym języku programowania. Zakoduj swój problem w języku, który właśnie wymyśliłeś, wywodzącym się z samych pojęć odpowiedniej domeny problemowej, zakoduj go tak naturalnie, jak to możliwe, i dopiero wtedy pomyśl o wdrożeniu tego nowego języka programowania lub sprowadzeniu kodu do ograniczeń istniejący język.

Takie podejście nazywa się programowaniem zorientowanym na język . Istnieje wiele technik efektywnego wdrażania języków specyficznych dla domeny i jest to szczególnie gorący temat dla społeczności Ruby.

Logika SK
źródło
1
Społeczność Haskell obejmuje również języki specyficzne dla domeny, a język programowania Haskell jest szczególnie odpowiedni do ich implementacji.
tdammers
Czy wdrożenie skryptu dostosowanego do potrzeb klienta opartego na języku osadzonym, takim jak Lua lub Tkl, uważa się za napisanie DSL? Jeśli tak, jak radzisz sobie z brakami np. Lua?
bastibe
@Paperflyer, w niektórych przypadkach sensowne jest implementowanie języków na czymś takim jak Lua (szczególnie jeśli jest to Metalua), ale łatwiej jest napisać odpowiedni kompilator dla większości typowych DSL.
SK-logika
@tdammers, tak, Haskell i Scala dotyczą DSL. Ale jestem z ciemniejszej strony Mocy: moim preferowanym podejściem jest metaprogramowanie. Uważam, że tłumacze ad hoc prawie zawsze są gorsi od kompilatorów.
SK-logika
2
@tdammers, DSL zaimplementowany na funkcjach wyższego rzędu jest praktycznie tłumaczem ad hoc. Nie możesz rozszerzyć składni Haskell w taki sam sposób, jak powiedzmy Lisp. Nawet z szablonem Haskell. Jest to całkowicie inny (i powiedziałbym, ograniczony) sposób implementacji DSL. W wielu przypadkach jest w porządku, ale w przypadku wszystkiego naprawdę złożonego prowadzi to do całkowicie nieczytelnych implementacji, podczas gdy wieloetapowe metaprogramowanie jest po prostu trywialne, bez względu na to, jak duża i obca jest twoja DSL.
SK-logika
2

Uważam, że poprawna odpowiedź, a ta, o której mówi książka:

należy starać się jak najdokładniej zakodować swój problem szczegółami swojego języka

Programując w język, zawsze zakładałem, że będzie to wykorzystywać techniki poza normalnym stylem języka, w których przyniesie to korzyść . Jest to kluczowa różnica w stosunku do pisania jednym stylem we wszystkich językach.

Na przykład nauka języka Haskell znacznie poprawiła moją umiejętność korzystania z funkcji wyższego rzędu. Teraz, programując w języku c #, używam różnych IEnumerablemetod, takich jak Selectczęściej, ponieważ używanie tych metod prowadzi do czystszego kodu niż pisanie w pętlach. Mam również tendencję do używania funkcji pass i use (tj. Func<int, int>) Częściej ze względu na moje doświadczenie haskell. Z tego powodu spadło moje zastosowanie dziedziczenia i w większości przypadków wynik jest prostszy.

Jednak nie używam pojęć takich jak monady lub algebraiczne typy danych w języku c #. Wynika to z faktu, że żaden z nich nie jest wyraźnie reprezentowany w języku c # i nie przynosi korzyści w zamian za wiele niejasności.

Używam więc narzędzi tego języka, aby wykorzystać umiejętności, które mam najlepiej. Uważam, że to programowanie na język.

David Miani
źródło
0

Czy zaproponowałbyś, abyś starał się jak najdokładniej zakodować swój problem przy pomocy szczegółów swojego języka, czy raczej raczej ogólnie wyszukać najbardziej eleganckie rozwiązanie, nawet jeśli oznacza to, że musisz wdrożyć możliwie niezręczne konstrukcje, które nie istnieją natywnie w swoim języku?

Chodzi o to, że dobrzy programiści nie muszą się języka. Cytat z książki mówi o „narzędziach programistycznych do ich dyspozycji” - oznacza to, że jeśli znasz perla i Javę, to może powinieneś użyć perla do tej szybkiej manipulacji ciągiem. Języki programowania nie są ograniczeniami, ale narzędziami, których używamy do rozwiązywania problemów. To jest (imo) do czego zmierza Code Complete. Nie koduj w polu języka / środowiska programowania, umieść najlepsze rozwiązanie w najlepszym języku / środowisku programowania dla siebie, swojego problemu i rozwiązania.

Telastyn
źródło