Devo prendere un linguaggio di programmazione funzionale?


10

Di recente sono stato più preoccupato per il modo in cui scrivo il mio codice. Dopo aver letto alcuni libri sui modelli di progettazione (e la loro realizzazione troppo zelante, ne sono certo) ho spostato il mio pensiero notevolmente verso l'incapsulamento di ciò che cambia. Tendo a notare che scrivo meno interfacce e un codice più orientato ai metodi, in cui adoro trasformare la vita in vecchie classi con predicati, azioni e altre attività delegate. Tendo a pensare che spesso cambiano le azioni, quindi le incapsulo. Anche spesso, sebbene non sempre, suddivido le interfacce in un singolo metodo, e quindi preferisco usare un delegato per l'attività invece di forzare il codice client per creare una nuova classe.

Quindi immagino che poi mi abbia colpito. Dovrei invece fare una programmazione funzionale?
Modifica: potrei avere un'idea sbagliata sulla programmazione funzionale.

Attualmente la mia lingua preferita è C # e vengo da un background C ++. Lavoro come sviluppatore di giochi ma attualmente sono disoccupato.

Ho una grande passione per l'architettura. Le mie virtù sono codice pulito, flessibile, riutilizzabile e mantenibile. Non so se sono stato avvelenato in questi modi o se è in meglio. Sto avendo la febbre da refactoring o dovrei andare avanti? Capisco che questa potrebbe essere una domanda su "utilizzare lo strumento giusto per il lavoro" , ma mi piacerebbe sentire i tuoi pensieri.

Dovrei imparare un linguaggio funzionale? Uno dei miei fattori di paura è lasciare il comfort di Visual Studio.


Puoi provare F # se lasciare Visual Studio è un affare.
Adam Lear

Non è un affare. Non ho ancora provato molte altre alternative. Immagino di avere un po 'di paura di lavorare senza intellisense, refactoring o strumenti simili e ho questa idea che finisci per scrivere di nuovo il codice in un semplice editor di testo.
Dichiarazione del

Sono attualmente disoccupato ... non dovrebbe essere la prima cosa da risolvere?
Giobbe

Proverei a lavorare senza VS per un po '. Potresti scoprire che lavorare in un modo molto minimalista potrebbe essere divertente.
Zaccaria K,

@Job, sì, ma di recente sono stato colpito da una serie di eventi abbastanza brutti :) Ho danneggiato il mio piede (beh, non codifico con il mio piede, ma, comunque ...) solo di recente dopo aver lasciato il mio vecchio lavoro in cercane uno nuovo.
Dichiarazione del

Risposte:


5

Imparare cose nuove dovrebbe essere divertente. E imparare un nuovo modo di programmare dovrebbe renderti un programmatore migliore. Controlla uno di Haskell o Erlang, entrambi sono funzionali ma sono molto diversi. Se scegli Haskell, trova alcuni discorsi di "Simon Payton Jones" su YouTube o podcast. Il ragazzo è un grande oratore.


1
Ho scelto questa risposta per molte ragioni. @Zachary K dice che potrebbe essere divertente uscire da un luogo ben noto e avere un'altra prospettiva. Non dovrei aver paura di provare qualcosa di nuovo. Non è la fine dei giorni. Haskell è un linguaggio che ha attirato la mia attenzione in varie discussioni un paio di volte prima. Non so se ho bisogno di un linguaggio funzionale, ma come dice @Toby Allen è un ottimo modo di vedere come funzionano gli altri modi e sono d'accordo su questo dopo aver provato alcuni UnrealScript. @ammoQ ha perso un po 'il punto ma non avevo una definizione molto buona della mia domanda. Ricevo ancora le sue preoccupazioni.
Dichiarazione del

Felice di aiutare. Buon divertimento
Zachary K

14

Santo * * * *. Non esiste un proiettile d'argento. Scendi. Rilassati, fai un respiro profondo.

Solo perché hai uno strumento nella tua cassetta degli attrezzi, ciò non significa che sei obbligato a usarlo. Concentrati sul compito da svolgere, ovvero scrivendo un programma che funziona e rifletti quando il codice ha un cattivo odore. Non incapsulare e astrarre ogni piccolo dettaglio solo perché potrebbe cambiare un giorno in futuro. IMO è davvero molto meglio iniziare subito, KISS & YAGNI, e reagire alle mutevoli esigenze quando cambiano effettivamente .

Non credo che nessuno qui possa dirti se un linguaggio funzionale è più adatto alle tue esigenze. Perché non ci hai detto a cosa stai lavorando.


Bene, non sto lavorando a nulla in particolare in questo momento. Sono tra un lavoro e l'altro. Sono / ero uno sviluppatore di giochi.
Dichiarazione del

3
Questa è una situazione pericolosa per quanto riguarda l'eccessiva ingegneria. Nessuna scadenza, nessun arretrato, troppo tempo per essere ossessionato dai dettagli.
user281377

(Ci sono un sacco di congetture in vista poiché non ho una chiara idea in mente) Immagino che i miei "bisogni" si riflettessero maggiormente nel modo in cui preferisco scrivere il codice. Non conosco molto sulla programmazione funzionale e immagino che il nome potrebbe ingannarmi un po '. Sento solo che la mia preferenza non è tanto orientata agli oggetti come pensavo. Quindi forse dovrei divertirmi a lavorare in un altro paradigma?
Dichiarazione del

Sì, immagino sia il caso. Sono in una fase di apprendimento in questo momento, quindi è per questo che esploro le possibilità di scrivere in modi particolari. Al lavoro, spesso non si ha il tempo di scrivere tale codice e si deve rispettare il codice di condotta e mantenere uno stile coerente tra gli sviluppatori.
Dichiarazione del

2
Va assolutamente bene quando provi tutti gli strumenti a portata di mano ora che sei tra un lavoro e l'altro, ma temo che non possiamo dirti se la scarpa si adatta o meno.
user281377

12

Puoi prendere F # . È il linguaggio funzionale .NET, che ti consentirà di utilizzare Visual Studio e riutilizzare molte delle tue conoscenze .NET. Ovviamente i suoi assembly si integrano perfettamente con gli assembly C # (consentendo di combinare facilmente C #, C ++ / CLI e F # in un unico progetto). Il supporto di F # viene fornito con VS Pro o meglio, tuttavia non sono sicuro che sia abilitato per impostazione predefinita.


Penso che ci sia un componente aggiuntivo per F # in VS2008, ma è predefinito in VS2010.
apoorv020,

F # funziona anche con una VS Shell gratuita.
SK-logic

6

IMO, vale la pena provare un linguaggio funzionale. Anche se non lo usi mai direttamente in un prodotto rilasciato, apprenderlo aiuterà quasi sicuramente a dare una prospettiva / punto di vista leggermente diverso sulla programmazione. Anche se alla fine continui a fare tutto il tuo codice "reale" in C #, è molto probabile che ti aiuterà a migliorare il codice che scrivi in ​​C #.

Come altri hanno già detto, la scelta ovvia per qualcuno abituato a Visual Studio è F #, che è fondamentalmente un derivato Ocaml / Caml / ML. IMO, è stata una buona scelta da parte di Microsoft per introdurre le persone alla programmazione funzionale: è un linguaggio funzionale a tutti gli effetti, ma non ha una sintassi quasi straniera come alcuni (ad esempio, mentre i linguaggi basati su Lisp lo fanno hanno dei veri vantaggi, i principianti hanno quasi sempre difficoltà a leggere).


2

Si, dovresti.

Se scegli una lingua pura, come Haskell, imparerai non solo una nuova lingua, ma un nuovo modo di pensare. Questo può aiutarti anche in seguito nel tuo lavoro proceurale / OO.

F #, d'altra parte, non è puro e quindi puoi facilmente perdere ciò che è importante nella programmazione funzionale. Puoi, per così dire, continuare a scrivere programmi procedurali che mutano una variabile qui, eseguendo alcuni effetti collaterali lì, proprio nella sintassi F #.


In realtà ho iniziato su tryhaskell.org :) È eccitante imparare cose nuove.
Dichiarazione del

1

Se stai già utilizzando c # non hai bisogno di un nuovo linguaggio - con la combinazione di metodi di estensione, lambdas e tipi generici Func / Action è abbastanza facile scrivere codice funzionale in C # - in questo modo puoi usare uno stile funzionale in gli algoritmi in cui ha più senso senza la necessità di cambiare l'intera applicazione.


1
Hai sempre bisogno di un'altra lingua. Anche se non lo usi mai, è una grande esperienza di apprendimento imparare una nuova lingua. Nessuna lingua ha tutto.
Toby Allen,

Devi sempre imparare, ma non devi sempre imparare un'altra lingua. Il vantaggio deriva dall'apprendimento dei concetti di programmazione funzionale piuttosto che del linguaggio stesso, e puoi farlo senza lasciare l'ambiente familiare e cambiare l'intero progetto. C # è abbastanza buono, e in termini pratici c'è un enorme vantaggio di avere solo il codice funzionale negli algoritmi che ne traggono effettivamente vantaggio.
Tom Clarkson,

Sì, suppongo che la mia preoccupazione fosse più distorta se ci fossero lingue più adatte (sintatticamente) per lavorare con metodi / funzioni nel modo in cui mi trovo spesso a lavorare mentre sto giocando. C # offre espressioni lambda e questo è bello in sé, ma ad esempio avere una funzione restituisce un valore senza parametri restituisce codice come () => x, e forse ci sono modi più puliti per procedere.
Dichiarazione del

+1 @Toby. Di recente ho sfogliato il riferimento di UnrealScript e ho visto alcune interessanti soluzioni linguistiche per lavorare con stati ecc. Passa a C # in termini di pensiero sul problema e hanno una soluzione abbastanza bella. Quindi sì, credo che tu impari molto quando esci dalla tua sandbox e saccheggi i tuoi vicini per tutta la sabbia e il giocattolo che trovi :)
Dichiarazione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.