Domanda

Sarei interessato a conoscere lo sviluppo su larga scala in Python e in particolare come mantenere una base di codice di grandi dimensioni?

  • Quando si apportano modifiche di incompatibilità alla firma di un metodo, come si trovano tutti i luoghi in cui quel metodo viene chiamato. In C ++ / Java il compilatore lo troverà per te, come lo fai in Python?

  • Quando apporti modifiche all'interno del codice, come scopri quali operazioni fornisce un'istanza, dato che non hai un tipo statico da cercare?

  • Come gestite / impedite errori di battitura (errori di battitura)?

  • UnitTest è usato come sostituto del controllo statico del tipo?

Come puoi immaginare, ho quasi lavorato solo con linguaggi tipicamente statici (C ++ / Java), ma vorrei mettere le mani su Python per programmi più grandi. Ma ho avuto una brutta esperienza, molto tempo fa, con il linguaggio clipper (dBase), anch'esso digitato in modo dinamico.

È stato utile?

Soluzione

Dato che nessuno ha sottolineato pychecker, pylint e strumenti simili, lo farò: pychecker e pylint sono strumenti che possono aiutarti a trovare ipotesi errate (su firme di funzione, attributi di oggetto, ecc.) Non troveranno tutto ciò che un compilatore potrebbe trovano in una lingua tipicamente statica, ma possono trovare problemi che anche questi compilatori per tali lingue non riescono a trovare.

Python (e qualsiasi linguaggio tipizzato in modo dinamico) è fondamentalmente diverso in termini di errori che è probabile che tu causi e in che modo li rilevi e risolvi. Ha lati negativi e lati positivi definiti, ma molti (incluso me) sostengono che nel caso di Python, la facilità di scrivere codice (e la facilità di renderlo strutturalmente solido) e di modificare il codice senza non si rompono La compatibilità API (aggiungendo nuovi argomenti opzionali, fornendo oggetti diversi che hanno lo stesso insieme di metodi e attributi) lo rendono adatto per basi di codice di grandi dimensioni.

Altri suggerimenti

Non usare un cacciavite come martello

Python non è un linguaggio tipicamente statico, quindi non provare ad usarlo in questo modo.

Quando usi uno strumento specifico, lo usi per quello che è stato creato. Per Python significa:

  • Digitazione anatra : nessun controllo del tipo. Solo il comportamento conta. Pertanto, il codice deve essere progettato per utilizzare questa funzione. Un buon design significa firme generiche, nessuna dipendenza tra i componenti, alti livelli di astrazione .. Quindi se cambi qualcosa, non dovrai cambiare il resto del codice. Python non si lamenterà nemmeno, per quello per cui è stato costruito. I tipi non sono un problema.

  • Enorme libreria standard . Non è necessario modificare tutte le chiamate nel programma se si utilizzano funzionalità standard che non sono state codificate. E Python viene fornito con batterie incluse. Continuo a scoprirli ogni giorno. Non avevo idea del numero di moduli che potevo usare quando ho iniziato e ho provato a riscrivere cose esistenti come tutti. Va bene, non puoi farlo tutto dall'inizio.

Non scrivi Java, C ++, Python, PHP, Erlang, qualunque cosa, allo stesso modo. Sono buoni motivi per cui c'è spazio per ognuna di così tante lingue diverse, non fanno le stesse cose.

I test unitari non sostituiscono

I test unitari devono essere eseguiti con qualsiasi lingua. La più famosa libreria di unit test ( JUnit ) proviene dal mondo Java!

Questo non ha nulla a che fare con i tipi. Controlli di nuovo i comportamenti. Eviti i problemi con la regressione. Assicuri che il tuo cliente sia sulla buona strada.

Python per progetti su larga scala

  

Lingue, librerie e framework   non ridimensionare. Le architetture lo fanno.

Se si progetta un'architettura solida, se si è in grado di farla evolvere rapidamente, si ridimensionerà. Aiuti ai test unitari, controllo automatico del codice. Ma sono solo reti di sicurezza. E quelli piccoli.

Python è particolarmente adatto a progetti di grandi dimensioni perché applica alcune buone pratiche e incorpora molti schemi di progettazione usuali. Ma ancora una volta, non usarlo per ciò che non è progettato. Ad esempio: Python non è una tecnologia per attività ad alta intensità di CPU.

In un grande progetto, molto probabilmente userete comunque diverse tecnologie. Come SGBD (francese per DBMS ) e un linguaggio di template, oppure. Python non fa eccezione.

Probabilmente vorrai usare C / C ++ per la parte del tuo codice che devi essere veloce. O Java per adattarsi in un Tomcat . Non lo so, non importa. Python può giocare bene con questi.

Come conclusione

La mia risposta potrebbe sembrare un po 'scortese, ma non fraintendetemi: questa è un'ottima domanda.

Molte persone vengono a Python con vecchie abitudini. Mi sono fregato cercando di codificare Java come Python. Puoi, ma non otterrai mai il meglio.

Se hai giocato / vuoi giocare con Python, è fantastico! È uno strumento meraviglioso. Ma solo uno strumento, davvero.

Ho avuto qualche esperienza con la modifica di "Frets On Fire", un pitone open source "Guitar Hero" clone.

come la vedo io, python non è davvero adatto per un progetto su larga scala.

Mi sono ritrovato a dedicare gran parte del tempo di sviluppo al debug di problemi relativi all'assegnazione di tipi incompatibili, cose che i linguaggi con caratteri statici rivelano senza sforzo al momento della compilazione. inoltre, poiché i tipi sono determinati in fase di runtime, cercare di capire il codice esistente diventa più difficile, perché non hai idea di quale sia il tipo di quel parametro che stai attualmente visualizzando.

oltre a ciò, chiamare le funzioni usando la loro stringa di nome con la funzione integrata __getattr__ è generalmente più comune in Python che in altri linguaggi di programmazione, rendendo così il grafico della chiamata a una certa funzione piuttosto difficile (sebbene sia possibile chiamare funzioni con il loro nome anche in alcune lingue tipicamente statiche).

Penso che Python brilli davvero nel software su piccola scala, nello sviluppo rapido di prototipi e nell'incollaggio di programmi esistenti insieme, ma non lo userei per progetti software su larga scala, poiché in questi tipi di programmi la manutenibilità diventa il vero problema, e in la mia opinione python è relativamente debole lì.

i miei 0,10 EUR:

Ho diverse applicazioni Python nello stato 'produzione'. la nostra azienda usa java, c ++ e python. sviluppiamo con l'ide eclissi (pydev per python)

gli unittest sono la soluzione chiave per il problema. (anche per c ++ e java)

il mondo meno sicuro di "quotazione dinamica" ti renderà meno incurante della qualità del tuo codice

A BORDO :

sviluppo su larga scala non significa che usi una sola lingua!

lo sviluppo su larga scala utilizza spesso una manciata di lingue specifiche del problema .

quindi accetto il problema del martello :-)


PS: static-typing & amp; pitone

Ecco alcuni elementi che mi hanno aiutato a mantenere un sistema abbastanza grande in Python.

  • Struttura il tuo codice in livelli. vale a dire logica biz separata, logica di presentazione e livelli di persistenza. Investi un po 'di tempo nella definizione di questi livelli e assicurati che tutti i partecipanti al progetto siano coinvolti. Per i sistemi di grandi dimensioni, può essere fondamentale anche creare un framework che ti costringa a un certo modo di sviluppo.

  • I test sono fondamentali, senza i test unitari probabilmente si otterrà una base di codice ingestibile molte volte più veloce rispetto ad altre lingue. Tieni presente che spesso i test unitari non sono sufficienti, assicurati di disporre di diversi test di integrazione / accettazione che puoi eseguire rapidamente dopo qualsiasi modifica importante.

  • Utilizza il principio Fail Fast . Aggiungi affermazioni per i casi in cui ritieni che il tuo codice sia vulnerabile.

  • Avere la registrazione / gestione degli errori standard che ti aiuteranno a risolvere rapidamente il problema

  • Usa un IDE (pyDev funziona per me) che fornisce in anticipo il tipo, l'integrazione pyLint / Checker per aiutarti a rilevare subito errori di battitura comuni e promuovere alcuni standard di codifica

  • Attento alle tue importazioni, non fare mai da x import * o fare importazioni relative senza usare.

  • Esegui refactoring, uno strumento di ricerca / sostituzione con espressioni regolari è spesso tutto ciò che serve per spostare metodi / refactoring del tipo di classe.

Modifiche incompatibili alla firma di un metodo. Ciò non accade tanto in Python come in Java e C ++.

Python ha argomenti opzionali, valori predefiniti e molta più flessibilità nella definizione delle firme dei metodi. Inoltre, digitando duck significa che, ad esempio, non è necessario passare da una classe a un'interfaccia come parte di una modifica significativa del software. Le cose non sono così complesse.

Come trovi tutti i luoghi in cui viene chiamato quel metodo? grep funziona per linguaggi dinamici. Se hai bisogno di sapere ogni posto in cui viene utilizzato un metodo, grep (o ricerca equivalente supportata da IDE) funziona alla grande.

Come scopri quali operazioni fornisce un'istanza, dato che non hai un tipo statico da cercare?

a. Guarda la fonte. Non devi affrontare il problema Java / C ++ delle librerie di oggetti e dei file jar. Non hai bisogno di tutti gli aiuti e gli strumenti elaborati richiesti da quelle lingue.

b. Un IDE può fornire informazioni sulla firma in molte circostanze comuni. Puoi facilmente sconfiggere i poteri di ragionamento del tuo IDE. Quando ciò accade, dovresti probabilmente rivedere ciò che stai facendo per essere sicuro che abbia senso. Se il tuo IDE non è in grado di fornire informazioni sul tipo, forse è troppo dinamico.

c. In Python, lavori spesso attraverso l'interprete interattivo. A differenza di Java e C ++, puoi esplorare le tue istanze direttamente e in modo interattivo. Non hai bisogno di un IDE sofisticato.

Esempio:

  >>> x= SomeClass()
  >>> dir(x)

Come si gestiscono / impediscono gli errori di battitura? Come per le lingue statiche: non le si impedisce. Li trovi e li correggi. Java può trovare solo una certa classe di errori di battitura. Se hai due nomi di classe o variabili simili, puoi finire in guai seri, anche con il controllo del tipo statico.

Esempio:

class MyClass { }
class MyClassx extends MyClass { }

Un errore di battitura con questi due nomi di classe può causare il caos. [" Ma non mi metterei in quella posizione con Java, " la gente dice. Concordato. Non mi metterei nemmeno in quella posizione con Python; fai lezioni profondamente diverse e falliranno presto se vengono utilizzate in modo improprio.]

UnitTest viene utilizzato come sostituto del controllo del tipo statico? Ecco l'altro punto di vista: il controllo del tipo statico sostituisce un design chiaro e semplice.

Ho lavorato con programmatori che non erano sicuri del perché un'applicazione funzionasse. Non sono riusciti a capire perché le cose non si sono compilate; non conoscevano la differenza tra la superclasse astratta e l'interfaccia, e non riuscivano a capire perché un cambiamento in atto causasse un blocco di altri moduli in un file JAR separato. Il controllo del tipo statico ha dato loro una falsa fiducia in un design difettoso.

I linguaggi dinamici consentono ai programmi di essere semplici. La semplicità è un sostituto per il controllo del tipo statico. Clarity è un sostituto del controllo del tipo statico.

La mia regola generale è quella di utilizzare linguaggi dinamici per piccoli progetti non mission-critical e linguaggi di tipo statico per grandi progetti. Trovo che il codice scritto in un linguaggio dinamico come python venga "aggrovigliato" più velocemente. In parte è perché è molto più veloce scrivere codice in un linguaggio dinamico e questo porta a scorciatoie e design peggiore, almeno nel mio caso. In parte è perché ho IntelliJ per il refactoring semplice e veloce quando uso Java, cosa che non ho per Python.

La solita risposta a questo è test testing testing. Dovresti avere una vasta suite di test unit ed eseguirla spesso, in particolare prima che una nuova versione sia online.

I fautori di linguaggi tipizzati dinamicamente sostengono il caso che si debba testare comunque perché anche in una lingua tipicamente statica la conformità alle regole grezze del sistema dei tipi copre solo una piccola parte di ciò che può potenzialmente andare storto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top