• [^] # Re: et les fonctions

    Posté par (site web personnel) . En réponse au journal Software architecture considered harmful. Évalué à 4.

    Le problème c'est que c'est souvent pas si simple.

    Par exemple, la fonction "à éviter" est parfaitement lisible pour moi.
    En pratique, les fonction sont bien plus longues et donc plus dur à diviser

    bool readTemperature(Sensor * sensor, Field field; const char *filename) {
     SensorHandle *sensor_handle = connectToSensor(sensor, NULL, true);
     Value *v = readSensorValue(sensor_handle, field);
     FILE *fp = fopen(filename, "w");
     if (fp) {
     fwrite(... v ... field ...);
     fclose(fp)
     }
     freeSensorValue(v);
     freeSensorHandle(sensor_handle)
     return fp != NULL;
    }

    Alors bon, tu dois passer plein d'arguments

    bool readTemperature(Sensor * sensor, Field field, const char *filename) {
     SensorHandle *sensor_handle = connectToSensor(sensor, NULL, true);
     Value *v = readSensorValue(sensor_handle, field);
     bool ret = writeSensorValue(v, field, filename);
     freeSensorValue(v);
     freeSensorHandle(sensor_handle)
     return ret;
    }
    void writeSensorValue(Value *v, Field field, const char *filename) {
     FILE *fp = fopen(filename, "w");
     if (fp) {
     fwrite(... v ... field ...);
     fclose(fp);
     return true;
     }
     return false;
    }

    Ok, dans cet exemple c'est encore correcte mais il y a des cas ou séparer en différente fonction demande de passer tellement de paramètre que le boiler plate rends le code plus difficile à lire, surtout si l'ordre des trucs est changer.
    Et il y a plein de question comme quelle fonction dois libérer les ressources.

    Enfin soit.. qui écrit encore en C de toute façon?
    Perso, j'écrirais plutôt le code comme ça:

    bool readTemperature(Sensor &sensor, Field field, sting_view filename) {
     auto sensor_handle = sensor.connectSensor();
     auto v = sensor_handle.readValue(field);
     if (auto file = File::create(filename)) {
     file.write(... v .. field);
     return true;
     };
     return false;
    }