|
![]() |
#1 |
bleargh
Join Date: Aug 2010
Location: sverige
Posts: 2,859
|
Functional programming for noobs
Usate principi di programmazione funzionale per lavoro? Vi divertite? Pensate di smettere?
![]() Con la certezza che questo sarà l'unico post del thread, comincio io! ![]() Lavorando principalmente in c#, java/kotlin e typescript, ho cominciato ad introdurre con estrema soddisfazione immutabilità, funzioni pure e tipi precisi per ogni cosa; ognuna di queste cose si sta rivelando una vittoria notevole in termini di leggibilità del codice e manutenibilità, in alcuni casi, di performances. Unico problema, tra l'introduzione di questi concetti nei team dove entro al ringraziamento finale dei programmatori che cominciano a usarli, mi trovo odiato a ogni merge request. Avete vissuto qualcosa del genere? |
![]() |
![]() |
![]() |
#2 |
3v1l l33t
Join Date: May 2004
Posts: 991
|
Scusa odiato perché, codice diverso dal solito? Troppe diff/dimensioni del PR? Cambiamenti non relati al task/sottosistema che dovevi modificare/estendere? Troppo tempo perso nel refactoring? Cambi codice non coperto da test?
Alcune sono legittime altre no difficile da dire ![]() |
![]() |
![]() |
![]() |
#3 |
bleargh
Join Date: Aug 2010
Location: sverige
Posts: 2,859
|
Semplicemente un modo diverso di lavorare. Son più di dieci anni che c# ha le lambda e la monade ienumerable con select many, ma ancora c'è gente che non comprende il perché una select é più potente di un for pur essendo cento volte meno duttile dal loro punto di vista.
Quando durante il pairing o le mr gli dico di usare una reduce o fold o aggregate, il programmatore che non ha voglia di imparare un paradigma nuovo non capirà mai il valore di una pure function o dellimmutabilita. Semplicemente comincia a tirare i remi in barca, credendo che quanto ha fatto finora sia messo in discussione. Si sente aggredito insomma. Un disclaimer é d'obbligo comunque, oramai sono 6 anni che faccio tutoraggio, quindi ho pure un sacco di soddisfazioni, sto parlando di quei casi intermedi, o di quando trovo particolari resistenze da programmatori ai quali importa poco la qualità o la tecnica. |
![]() |
![]() |
![]() |
#4 |
3v1l l33t
Join Date: May 2004
Posts: 991
|
Vabbe allora cxxi loro
![]() Noi abbiamo "risolto" con un documento riguardo stile e best practices; l'originale l'ho creato io ma tutti possono modificarlo via PR. Per dire, se qualcuno scrive un for che è coperto da uno degli algoritmi in stl lo si commenta in PR "read the style guide". Deve cmq partire da sopra (tuo team lead, coordinator, o come lo chiamate voi ![]() Il grosso delle cose indicate nella guida viene anche segnalato da cppcheck e clang-tidy quindi a breve abbiamo intenzione di integrarli nelle PR. |
![]() |
![]() |
![]() |
#5 |
Premium Netgamers
Join Date: Sep 2007
Location: 45°44'15"N - 9°18'42''E
Posts: 1,971
|
|
![]() |
![]() |
![]() |
#6 |
bleargh
Join Date: Aug 2010
Location: sverige
Posts: 2,859
|
Posso solo rendere peggio la spiegazione di Wikipedia ma ci provo:
La programmazione funzionale é un paradigma che si affianca/sostituisce a quello imperativo/ad oggetti dove sono le funzioni e la loro composizione la priorità, al posto delle classi/oggetti. In pratica ci si riferisce per lo più ad un modo di pensare ed affrontare i problemi differente e più vicino alla matematica (o ad una branca della matematica, per la precisione la teoria delle categorie). Di recente moltissimi linguaggi ad oggetti si sono avvicinati alla programmazione funzionale introducendo piccole/grandi modifiche, ma ci sono molti altri concetti che stanno sotto a questo ombrello della PF, e genericamente sono difficili da proporre ai programmatori che meno vogliono aggiornarsi.. |
![]() |
![]() |
![]() |
#7 |
bleargh
Join Date: Aug 2010
Location: sverige
Posts: 2,859
|
A lavoro ho cominciato un book club dove leggiamo functional programming in kotlin della manning. Sembra funzionare come approccio per insegnare ai junior senza dover far di continuo pair programming, e consiglio un sacco il libro: è un evoluzione del libro su scala, ha un fracco di esercizi utili e non parte in maniera troppo aggressiva.
|
![]() |
![]() |
![]() |
#8 |
Registered User
Join Date: Feb 2010
Posts: 11,502
|
Functional programming funziona quando usi un linguaggio totalmente costruito attorno a functional programming o quando applichi qualche concetto senza andare full nazi FP.
Viceversa e' la classica epifania che hanno tutti i developer che a un certo punto scoprono FP pensando sia il sacro graal, cominciano a scrivere righe e righe di codice in FP in linguaggi che non sono nati per essere scritti in FP, finendo 3 mesi dopo a rileggere il loro codice di 3 mesi prima senza capire nulla. Film gia' visto ![]()
__________________
We don't get old because of age, we get old because we stop playing. |
![]() |
![]() |
![]() |
#9 |
bleargh
Join Date: Aug 2010
Location: sverige
Posts: 2,859
|
Sinceramente sono quattro anni che continuo a lavorarci e sono stato fortunato a non cadere mai in quella trappola, principalmente in due aziende e nazioni totalmente differenti con scala, Kotlin e chiazze di f#, credo tu stia parlando di qualcosa di diverso, dato che i principi funzionali stanno diventando sempre più parte integrale di ogni linguaggio...
Tra poco ci vorrà più tempo a spiegare come fare codice imperativo che fare codice funzionale, basta stare lontani da un certo tipo di aziende e difficilmente si ritorna indietro... Last edited by bollo; 20th April 2022 at 21:32. |
![]() |
![]() |
![]() |
#10 | |
Non capirò mai le persone
Join Date: Apr 2014
Posts: 7,576
|
Quote:
A me spiegarono il concetto così e di lì in avanti ho sempre scritto codice a questa maniera, si parla di 12-10 anni fa. Comunque, nemmeno io sono un dev: magari stimolo una risposta più corretta della mia ![]() Contesto, Python (puoi testare sta roba su, boh, https://extendsclass.com/python.html): Code:
global_list = [] def append_to_list(x): global_list.append(x) append_to_list(1) append_to_list(2) print(global_list) Più idoneo sarebbe: Code:
def append_to_list(x, list): list.append(x) newlist = [] append_to_list(1,newlist) append_to_list(2,newlist) print(newlist) In python ci sono poi le funzioni lambda che sono un po' l'essenza della cosa: sono funzioni senza definizione che possono avere solo un'espressione. Tipo: Code:
x = lambda a : a + 10 print(x(5)) Che permette di fare cose tipo: Code:
def myfunc(n): return lambda a : a * n Ma sta a vedere... Code:
def myfunc(n): return lambda a : a * n raddoppia = myfunc(2) print(raddoppia(11)) triplica = myfunc(3) print(triplica(11)) centuplica = myfunc(100) print(centuplica(11)) calcolo_iva = myfunc(0.21) print(calcolo_iva(11)) Meglio ancora con filter, map e reduce: Code:
from functools import reduce interi = [1,2,3,4,5,6] dispari = filter(lambda n: n % 2 == 1, interi) dispari_quadrati = map(lambda n: n * n, dispari) totale = reduce(lambda acc, n: acc + n, dispari_quadrati) print(total) Code:
interi = [1,2,3,4,5,6] dispari = [] dispari_quadrati = [] total = 0 for i in interi: if i%2 ==1: dispari.append(i) for i in dispari: dispari_quadrati.append(i*i) for i in dispari_quadrati: totale += i print(totale) Last edited by char; 4th May 2022 at 01:37. |
|
![]() |
![]() |
![]() |
#11 |
...adesso basta!
Join Date: Jan 2003
Location: fatti i cazzi tuoi
Posts: 5,831
|
A me la fp piace parecchio, ma devo dire che spesso quando devo leggerla ci impiego 5 volte tanto il tempo che impiego a leggere e capire codice imperativo.
Inoltre, spesso chi usa la fp vedo che accorcia tutto l'accorciabile, con variabili e funzioni a singola lettera, esisterà un girone dell'inferno per questi? ![]() Quando si insegna la fp un criterio fondamentale dovrebbe essere quello di impostare nomi di variabili e di funzione in maniera estesa e descrittiva, e nei punti più innestati e criptici buttarci un commento oneline giusto per far scontare al te futuro o ad altri quei 10 minuti in più per fare lo stack mentale e capire cosa sta facendo quella maledetta funzione chiamata "a" con parametri "b" e "c" dentro una funzione "d" etc....
__________________
Ricorda il passato, comprendi il presente, migliora il futuro. Errare è umano, ma per fare veramente casino ci vuole la password di root! |
![]() |
![]() |
![]() |
#12 |
Registered User
Join Date: Feb 2010
Posts: 11,502
|
Mediamente passiamo piu' tempo a leggere codice che a scriverlo, quindi questo dovrebbe essere un enorme red flag
__________________
We don't get old because of age, we get old because we stop playing. |
![]() |
![]() |
![]() |
#13 |
bleargh
Join Date: Aug 2010
Location: sverige
Posts: 2,859
|
Non so che linguaggi usate e che tipo di codebase leggiate ogni giorno, ma vi assicuro che sia in .NET che Java io con la PF ho aumentato di non poco la leggibilità:
Gli esempi sono così tanti che non so da cosa partire, la sola foldRight, appena la impari, ti permette di costruire da zero un sacco di funzionalità senza rompere alcun principio SOLID, e senza compromessi, se usi un linguaggio che supporta tailrecursion, ovviamente. |
![]() |
![]() |
![]() |
Thread Tools | |
Rate This Thread | |
|
|