Ho appena iniziato a lavorare in un'azienda in cui ho ereditato un codice C # da uno sviluppatore precedente. Conosco bene la programmazione, ho una laurea in ingegneria + una (non terminata, lunga diversi anni) educazione al dottorato in informatica e > 10 anni di precedenti esperienze di programmazione "pratica", principalmente in C ++ e Java, ma anche in altre lingue.
Il mio problema è che il codice che ho ereditato è, a mio avviso, eccessivamente ingegnerizzato. Ho enormi problemi seguendo il flusso del programma e trovando qualsiasi implementazione concreta di qualsiasi cosa. La quantità di astrazioni è totalmente sbalorditiva e non c'è documentazione di sorta. Inoltre, è difficile eseguire il debug dell'applicazione poiché si tratta di un'applicazione server divisa in un server "GUI-client" e un "Control-Server" (anche un'astrazione relativamente inutile poiché funzionano sempre sulla stessa macchina e c'è un Rapporto 1: 1 tra di loro) che si interfaccia con l'hardware industriale che non è disponibile.
Per dare un esempio illustrativo, una delle classi ha un campo come questo:
IClientFactory<IClient<ICommunicationService>> communicationFactory;
Ho difficoltà a girarmi attorno visto che anche il programmatore precedente ha scritto questo codice (cioè non usando un bit shift, e questa è una delle poche cose documentate):
public static bool IsBitHigh(int value, int bitIndex) {
int valueAbs = Math.Abs(value);
if (bitIndex < 0)
throw new ArgumentException("Bit index must be above or equal to 0");
int result = valueAbs & Convert.ToInt32(Math.Pow(Convert.ToDouble(2.0), Convert.ToDouble(bitIndex - 1)));
return (result > 0);
}
Ci sono anche indicazioni che il programmatore precedente è rimasto sorpreso dal fatto che il lancio di float su "ints" le abbatte, e questo avviene dopo diversi anni nel settore.
Quindi dato questo ho due domande:
- È questo il modo in cui il codice si presenta in genere nel settore? (Ho un background ingegneristico / di ricerca, quindi mi sono illuso che le persone stessero ancora usando i cicli for.)
E, ancora più importante:
- C'è un modo semplice per ridurre la complessità del codice, cioè sostituire le interfacce con le loro implementazioni concrete? (Per invertire il senso del codice in un certo senso.)