Replies: 7 comments 4 replies
-
Idée de @guilpier-code : séparer les gros objets en objets plus petits, les fournir aux constructeurs. Cela permet d'écrire des constructeurs plus concis (moins de paramètres) // Avant
class GrosObjet {
GrosObjet(int param1, double param2, double param3);
};
// Après
class PetitObjet1 {
PetitObjet1(int param1);
};
class PetitObjet2 {
PetitObjet2(double param2, double param3);
};
class GrosObjet2 {
GrosObjet2(PetitObjet1&&, PetitObjet2&&);
}; |
Beta Was this translation helpful? Give feedback.
-
Distinguer les données "métier" des structures temporaires ( |
Beta Was this translation helpful? Give feedback.
-
Distinguer le chargement/écriture des autres fonctions-membres class ThermalClusterList : public ClusterList<ThermalCluster>
{
public:
ThermalClusterList();
void calculationOfSpinning();
/*!
** \brief Calculation of Spinning for all thermal clusters (reverse)
*/
void reverseCalculationOfSpinning();
//@}
bool loadFromFolder(Study& s, const AnyString& folder, Area* area);
bool saveToFolder(const AnyString& folder) const override;
};
// Après
class ThermalClusterList
{
public:
ThermalClusterList();
void calculationOfSpinning();
/*!
** \brief Calculation of Spinning for all thermal clusters (reverse)
*/
void reverseCalculationOfSpinning();
//@}
}; // class ThermalClusterList
// Placé très haut : interface commune writers
template<class T>
class Writer {
public:
virtual void write(const T&) = 0;
};
class FileThermalClusterListWriter : public Writer<ThermalClusterList>
{
void write(const ThermalClusterList&) override;
};
// Même chose pour la sauvegarde |
Beta Was this translation helpful? Give feedback.
-
Casser les dépendances en donnant en argument aux fonctions des petits objets // Avant
Hydro_problem_costs::Hydro_problem_costs(const Data::Study& study)
{
switch (study.parameters.hydroHeuristicPolicy.hhPolicy)
{
case Data::hhpMaximizeGeneration:
waste = 33 * 68.;
break;
case Data::hhpAccommodateRuleCurves:
waste = 34.0;
break;
default:
waste = 34.0;
break;
}
}
// Après
Hydro_problem_costs::Hydro_problem_costs(Data::HydroHeuristicPolicy hhPolicy)
{
switch (hhPolicy)
{
case Data::hhpMaximizeGeneration:
waste = 33 * 68.;
break;
case Data::hhpAccommodateRuleCurves:
waste = 34.0;
break;
default:
waste = 34.0;
break;
}
} Avant le refactoring, la classe |
Beta Was this translation helpful? Give feedback.
-
Pouvoir définir les paramètres en chaînant les méthodes (par retour de référence non-constante) class GrosObjet {
public:
GrosObjet& setParam1(int param1);
GrosObjet& setParam2(double param2);
};
GrosObjet obj;
obj.setParam1(223)
.setParam2(3.13); |
Beta Was this translation helpful? Give feedback.
-
Je vais peut-être trop loin, mais si l'objectif de faire une palteforme est toujours là, vu le travail de design que ça implique une approche organisée pourrait nous aidée dans notre démarche : |
Beta Was this translation helpful? Give feedback.
-
Garantir la validité et la cohérence de chaque objet par construction. Ne pas exposer en public des méthodes ou des champs qui permettent à l'utilisateur des classes de créer des incohérences. Contres-exemples: class Area {
...
public:
AreaName name;
AreaName id;
...
}; Ici on peut créer une incohérence entre le nom et l'ID. On peut également modifier l'ID ici sans qu'il soit modifié là où c'est nécessaire dans l'étude ! Autre contre-exmple: class AreaList {
...
public:
//! All areas by their index
Area** byIndex;
//! All areas in the list
Area::Map areas;
...
}; Ici on peut modifier de manière complètement incohérente la liste par index et la map.
|
Beta Was this translation helpful? Give feedback.
-
Résumé
Pourquoi ?
Actuellement, les études sont principalement lues depuis des fichiers via des fonctions
loadFromFolder
.Dès lors que l'on souhaite créer une étude autrement (en mémoire), on se retrouve bien souvent sur une étude invalide.
L'idée serait d'avoir une API C++ qui permette de s'assurer qu'une étude en mémoire soit valide à la construction, soit empêcher la construction d'une étude invalide.
Cela permettrait de distinguer plus clairement ces étapes
Ainsi, le lecteur d'étude sous format de fichiers appellerait ces fonctions de l'API C++. A terme, on pourrait imaginer que d'autres lecteurs/écriteurs d'études fassent leur apparition en utilisant cette même API.
Un autre cas d'usage important est l'écriture de tests in-memory. L'écriture de ces tests serait rendue plus facile par une API claire et concise.
Enfin, on pourrait aussi exposer cette API dans d'autres langages comme Python.
Extensions possibles : récupération des résultats, lancement d'une étude
A discuter, très pratique pour les tests & Python.
Beta Was this translation helpful? Give feedback.
All reactions