Hur vet man att man skriver bra kod som professionell?
Jag har skrivit kod under många år. Framförallt C kod och Java kod och även MATLAB. Just nu kör jag C++ för jag behöver ett ISO-klassat språk som kan göra GUI. Viktigt det där med ISO.
Punkt 1:
När jag skriver kod så börjar jag alltid göra ett projekt och jag skriver lite kod mer och mer. Tillslut börjar jag få en struktur. Men denna struktur ändrar jag hela tiden.
Ibland har jag olika mappar som heter UI, Tools, Communication, USB. Eller så blandar jag in dom så UI är egen mapp medan Tools innehåller Communication och Communication innehåller USB. Då känner jag att jag har fått en struktur.
Punkt 2:
Sedan när jag programmerar så tänker jag mycket på lager. Till exempelvis:
Huvud vy -> Tab -> Loggnings Data -> Databas hanterare
Jag försöker använda enkapsulering så mycket som det går för att undvika det där med globala funktioner. Jag är noga med att inget lager kan "hoppa" över lager t.ex. Huvud Vy:n kan ej tala med Loggnings Data igenom en genväg. Sådant gillar jag inte. Grafiskt gränssnitt får aldrig ha genvägar. Jag är strikt på sådant.
Punkt 3:
Jag brukar skriva kod som knappt har några for-loopar, while-loopar och istället skriver jag kod som bara ser ut som rader. Exempelvis:
void Database_handling::create_new_calibration_model_table_for_tableView(){
if(calibration_model != nullptr)
delete calibration_model;
calibration_model = new QSqlTableModel;
calibration_model->setTable(CALIBRATION_TABLE_NAME);
calibration_model->setEditStrategy(QSqlTableModel::OnManualSubmit);
calibration_model->sort(0, Qt::SortOrder::DescendingOrder);
calibration_model->sort(1, Qt::SortOrder::DescendingOrder);
calibration_model->sort(2, Qt::SortOrder::DescendingOrder);
calibration_model->sort(3, Qt::SortOrder::DescendingOrder);
calibration_model->setHeaderData(0, Qt::Horizontal, tr("ID"));
calibration_model->setHeaderData(1, Qt::Horizontal, tr("Calibration ID"));
calibration_model->setHeaderData(2, Qt::Horizontal, tr("Calibration comment"));
calibration_model->setHeaderData(3, Qt::Horizontal, tr("Calibration date time"));
}
Jag använder mycket setters och getters i C++. I detta fall så finns det bara setters och inte getters.
Ibland använder jag for-loopar, men i QT ramverkhet så har jag ej haft behov av många for-loopar och bara 1 while loop. Jag använder dessa vid behov och försöker använda ramverkets funktioner så mycket som det går. Jag skulle ALDRIG falla mig in att använda 3:e parts mjukvara i ett C++ program. Orsaken har med att C++ saknar ett pakethanterarsystem, typ som Python och Java har.
Punkt 4:
En annan sak jag brukar göra är att jag gör små funktioner som utför bara 1 sak. T.ex.
- Skapa lista
- Anslut databas
- Radera rad
- Skicka meddelande
- Läs meddelande
- Läs en rad
Koden ovan gör 1 sak. Den fixar en tabell åt mig. Inget mer.
Punkt 5:
Jag använder minimal OOP och nästan aldrig använder jag:
- Arv
- Interface
- Polyformism
Arv kan vara bra om man har en bas-klass och interface kan vara bra om man har en stor abstrakt klass som innehåller allt. Men jag stöter sällan på problem som kan endast lösa med OOP. Faktiskt så har jag aldrig stött på ett problem där jag måste lösa det med ett interface. Spring Boot är dock ett undantag.
Det enda jag använder OOP är när jag ska begränsa användarens rätt att hoppa mellan lager och jag vill få en fin struktur på projektet. Mer än så är det inte. Jag kan lika gärna använda struct och funktioner om jag kör C. Det blir något svårt att ha privata fält i en struct, vilket inte går.
Punkt 6:
Jag försöker undvika boilerplate-kod t.ex. kod som upprepas hela tiden. Då samlar jag allt i funktioner, eventuellt statiska funktioner. Exempelvis:
UI_static_functions::UI_static_functions(){
}
int UI_static_functions::get_selected_row_from_table_view(QTableView* tableView){
QItemSelectionModel* selectionModel = tableView->selectionModel();
if(selectionModel == nullptr){
return -1; /* If we haven't add a selection model to our tableView */
}
QList<QModelIndex> qModelIndexList = selectionModel->selectedRows();
if(qModelIndexList.size() == 0){
return -1; /* If we havne't select a row in our tableView */
}
return qModelIndexList.at(0).row();
}
Då anropar jag funktionen med
int selected_row = UI_static_functions::get_selected_row_from_table_view(minTabell);
Punkt 7:
Jag försöker göra koden så läsbar som möjligt igenom att använda långa namn t.ex. open_this_webbrowser_and_check_for_error().
Punkt 8:
Jag skriver aldrig GUI för hand. Jag använder alltid utvecklingsverktyg. Alltid utvecklingsverktyg. Nu tror jag att många använder detta också, men det finns som är där och pillar i fxml(JavaFX), xml, html, xhml, jsp för hand. Jag är en riktig "Drag N Drop"-programmerare. Gillar sådant. Varför? Det blir mindre kod. Minimal kod älskar jag. Desto mindre kod, desto bättre kod blir det.
Punkt 9:
Jag använder kommentarer vid behov. När man inte kan förklara varför denna variabel kan vara -1 eller 0.
Jag använder aldrig långa kommentarer ovanför funktionens namn som beskriver exakt hur funktionen fungerar. Jag förstår ändå inte för jag tycker många skriver kod som är svår att titta på, vad dom har gjort. Till exempelvis så kan det vara en metod inom Java som ska utföra en kort procedur.
Jaha? Men argumenten ser inte ut som vanliga int, float, array[] argument. Det är mycket generics och jag ogillar sådant när det är generics på generics. Jag kan förstå om det handlar om en klass man ska bygga som ska hantera olika datatyper.
Här är en kod som får mig att se ???
https://github.com/optimatika/ojAlgo/blob/develop/src/main/ja...
Alltså kolla denna rad
public class NetworkInvoker extends WrappedANN implements BasicFunction.PlainUnary<Access1D<Double>, MatrixStore<Double>> {
Så den använder arv och interface samt interfacet har en statisk basfunktion med dubbla genericsargument, med dubbla generics. Sådant blir man lite rädd för.
Samma sak här. Jag förstår inte koden.
https://github.com/eclipse/deeplearning4j/blob/master/deeplea...
Troligtvis så är detta riktiga professionella kodare och det är säkert bara den som skrev denna kod, som förstår koden.
Punkt 10:
Jag skriver kod, simulerar och testar. Blir det fel, ändrar jag, simulerar och testar. Hela tiden. Koda, testa, koda, testa.
Tills jag har hittat att möjliga fel, då går jag vidare.
--------------------------------------------------------------------------------
Då är frågan. Hur vet jag att jag programmerar bra?
För jag tror inte programmering handlar om att hitta den mest avancerade lösningen som resulterar minimal och effektiv kod. Jag tror snarare att det handlar om att skriva den pedagogiska koden, oavsett om koden blir rätt bred med många filer. Vad tror ni?