-
Notifications
You must be signed in to change notification settings - Fork 97
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Ajoute une première version du dispositif départ 18-25 #1507
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je suis très gêné par le nombre de variables introduites. J'y vois une approche très pertinente d'un point de vue de génie logiciel, avec de l'encapsulation de fonctions, mais qui me paraît inappropriée pour la modélisation de la loi en code : chacun des éléments apportés n'a pas de sens d'un point de vue législatif, et le nombre de variables introduites dans l'espace de nommage global rend leur utilisation très compliquée.
Après plusieurs années d'écriture, d'investigation et de revue de code OpenFisca, je ne sais plus écrire des variables qui contiennent beaucoup de complexité et de logique. Je peux comprendre la gêne ressentie par la création de nombreuses variables mais, selon moi, elles ont bien chacune un seus d'un point de vue législatif (pris au sens très large, étant donné qu'ici, la loi, c'est de la documentation ANCV). La création de plusieurs variables permet aussi de créer des espaces de complexité séparés où les liens avec le restes de la modélisation du système socio-fiscal sont explicités et sont disposés à une sorte de frontière avec un nouvel espace de complexité. Cela facilite grandement la rédaction de tests plus unitaires et la réutilisation du moteur (lorsque l'on souhaite calculer qu'une variable en particulier). |
2014-09-05: | ||
value: 17000 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Quand on ne renseigne que
value
, je trouve plus lisible d'utiliser la notation condensée2014-09-05: 17000
🙂
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Super ! Ce dispositif me semble pertinent à ajouter tel quel en l'absence de lignes directrices sur l'éclatement des variables intermédiaires.
Je me permets de suggérer d'attendre jusqu'à demain fin d'après-midi avant d'intégrer puisque nous avons une discussion prévue précisément sur ce sujet et que cette implémentation me semble être un bon cas d'exemple, qui pourrait donc se retrouver impacté en fonction des résultats, et dont tout changement nécessitera un changement de version majeur 🙂
@MattiSG tu avais déjà validé la PR mais avec des réserves, donc je me suis permis de t'en redemander une. J'ai supprimé une variable (le calcul du plafond de ressources) mais conservé les variables d'éligibilité. Est-ce Ok pour toi ? Merci. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Est-ce Ok pour toi ?
Je persiste à penser que l'éclatement de depart1825_eligibilite
en depart1825_eligibilite_statut
et depart1825_eligibilite_financiere
n'apporte que très peu de lisibilité supplémentaire par l'éclatement en deux formules (lisibilité que l'on pourrait tout aussi bien retrouver avec deux blocs de code introduits par un commentaire ou en nommant une variable interne à la fonction), voire même qu'au contraire le nombre de lignes ajoutées est plutôt contre-productif pour la compréhensibilité au vu de la quantité de métadonnées nécessaires pour OpenFisca ; et que dans tous les cas ces variables supplémentaires exposées publiquement n'ont pas de valeur de réutilisabilité et au contraire la diminuent en demandant une exploration et un choix supplémentaires pour les réutiliser.
Je joins à cette revue une proposition de refactor qui illustre pour moi la lisibilité d'une seule formule, avec 30% de code en moins, et une seule variable publiquement exposée.
class depart1825_eligibilite_financiere(Variable): | ||
value_type = bool | ||
label = "Éligibilité au dispositif Départ 18-25 en raison des ressources du foyer" | ||
entity = Individu | ||
definition_period = MONTH | ||
reference = [ | ||
"https://programme-depart-1825.com/eligibilite/", | ||
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans" | ||
] | ||
|
||
def formula(individu, period, parameters): | ||
nbptr = individu.foyer_fiscal('nbptr', period.n_2) | ||
plafond_ressources = parameters(period).prestations.depart1825.plafond_ressources | ||
plafond_ressources = plafond_ressources.base + 2 * max_(0, nbptr - 1) * plafond_ressources.par_demi_part_supplementaire | ||
|
||
ressources = individu.foyer_fiscal('rfr', period.n_2) | ||
return ressources <= plafond_ressources | ||
|
||
|
||
class depart1825_eligibilite_statut(Variable): | ||
""" | ||
Situations non prises en compte | ||
- en contrat aidé, | ||
- inscrit dans une école de la deuxième chance, | ||
- volontaire en service civique, | ||
- jeunes suivis par l'Aide Sociale à l'Enfance. | ||
""" | ||
value_type = bool | ||
label = "Éligibilité au dispositif Départ 18-25 en raison de la situation du jeune" | ||
entity = Individu | ||
definition_period = MONTH | ||
reference = [ | ||
"https://programme-depart-1825.com/eligibilite/" | ||
] | ||
|
||
def formula(individu, period): | ||
etudiant_boursier = (individu('activite', period) == TypesActivite.etudiant) * individu('boursier', period) | ||
alternant = individu('alternant', period) | ||
garantie_jeunes = individu('garantie_jeunes', period) > 0 | ||
|
||
return etudiant_boursier + alternant + garantie_jeunes | ||
|
||
|
||
class depart1825_eligibilite(Variable): | ||
value_type = bool | ||
label = "Éligibilité au dispositif départ 18-25" | ||
entity = Individu | ||
definition_period = MONTH | ||
reference = [ | ||
"https://programme-depart-1825.com/eligibilite/", | ||
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans" | ||
] | ||
|
||
def formula(individu, period, parameters): | ||
criteres_age = parameters(period).prestations.depart1825.age | ||
age = individu('age', period) | ||
|
||
eligibilite_statut = individu('depart1825_eligibilite_statut', period) | ||
eligibilite_financiere = individu('depart1825_eligibilite_financiere', period) | ||
eligible = eligibilite_statut + eligibilite_financiere | ||
|
||
return (criteres_age.minimum <= age) * (age <= criteres_age.maximum) * eligible |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
class depart1825_eligibilite_financiere(Variable): | |
value_type = bool | |
label = "Éligibilité au dispositif Départ 18-25 en raison des ressources du foyer" | |
entity = Individu | |
definition_period = MONTH | |
reference = [ | |
"https://programme-depart-1825.com/eligibilite/", | |
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans" | |
] | |
def formula(individu, period, parameters): | |
nbptr = individu.foyer_fiscal('nbptr', period.n_2) | |
plafond_ressources = parameters(period).prestations.depart1825.plafond_ressources | |
plafond_ressources = plafond_ressources.base + 2 * max_(0, nbptr - 1) * plafond_ressources.par_demi_part_supplementaire | |
ressources = individu.foyer_fiscal('rfr', period.n_2) | |
return ressources <= plafond_ressources | |
class depart1825_eligibilite_statut(Variable): | |
""" | |
Situations non prises en compte | |
- en contrat aidé, | |
- inscrit dans une école de la deuxième chance, | |
- volontaire en service civique, | |
- jeunes suivis par l'Aide Sociale à l'Enfance. | |
""" | |
value_type = bool | |
label = "Éligibilité au dispositif Départ 18-25 en raison de la situation du jeune" | |
entity = Individu | |
definition_period = MONTH | |
reference = [ | |
"https://programme-depart-1825.com/eligibilite/" | |
] | |
def formula(individu, period): | |
etudiant_boursier = (individu('activite', period) == TypesActivite.etudiant) * individu('boursier', period) | |
alternant = individu('alternant', period) | |
garantie_jeunes = individu('garantie_jeunes', period) > 0 | |
return etudiant_boursier + alternant + garantie_jeunes | |
class depart1825_eligibilite(Variable): | |
value_type = bool | |
label = "Éligibilité au dispositif départ 18-25" | |
entity = Individu | |
definition_period = MONTH | |
reference = [ | |
"https://programme-depart-1825.com/eligibilite/", | |
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans" | |
] | |
def formula(individu, period, parameters): | |
criteres_age = parameters(period).prestations.depart1825.age | |
age = individu('age', period) | |
eligibilite_statut = individu('depart1825_eligibilite_statut', period) | |
eligibilite_financiere = individu('depart1825_eligibilite_financiere', period) | |
eligible = eligibilite_statut + eligibilite_financiere | |
return (criteres_age.minimum <= age) * (age <= criteres_age.maximum) * eligible | |
class depart1825_eligibilite(Variable): | |
""" | |
Situations non prises en compte | |
- en contrat aidé, | |
- inscrit dans une école de la deuxième chance, | |
- volontaire en service civique, | |
- jeunes suivis par l'Aide Sociale à l'Enfance. | |
""" | |
value_type = bool | |
label = "Éligibilité au dispositif départ 18-25" | |
entity = Individu | |
definition_period = MONTH | |
reference = [ | |
"https://programme-depart-1825.com/eligibilite/", | |
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans" | |
] | |
def formula(individu, period, parameters): | |
criteres_age = parameters(period).prestations.depart1825.age | |
age = individu('age', period) | |
eligibilite_age = (criteres_age.minimum <= age) * (age <= criteres_age.maximum) | |
etudiant_boursier = (individu('activite', period) == TypesActivite.etudiant) * individu('boursier', period) | |
alternant = individu('alternant', period) | |
garantie_jeunes = individu('garantie_jeunes', period) > 0 | |
eligibilite_statut = etudiant_boursier + alternant + garantie_jeunes | |
nombre_parts = individu.foyer_fiscal('nbptr', period.n_2) | |
plafond_ressources = parameters(period).prestations.depart1825.plafond_ressources | |
plafond_ressources = plafond_ressources.base + 2 * max_(0, nbptr - 1) * plafond_ressources.par_demi_part_supplementaire | |
ressources = individu.foyer_fiscal('rfr', period.n_2) | |
eligibilite_financiere = ressources <= plafond_ressources | |
return eligibilite_age * (eligibilite_statut + eligibilite_financiere) |
10ac672
to
b91f3b1
Compare
Hello @QuentinMadura ! Je vois qu'il y a de nombreux pushes et force-pushes sur cette PR ouverte il y a trois mois et déjà revue à deux reprises. Or :
En l'occurrence, cette PR disposait déjà d'une revue acceptée. Je ne sais plus si cette acceptation est encore valide à ce stade au vu du nombre de commits ultérieurs, ce qui me pose d'autant plus problème que c'est moi qui avais accepté : je ne sais pas si je peux encore prendre à ce stade la responsabilité d'une validation donnée il y a plusieurs semaines ! Mes demandes sont donc de :
Est-ce que cela te semble assez clair ? Est-ce acceptable ? 🙂 Bonne journée, |
Bonjour @MattiSG, merci de ton retour et pour tes commentaires, et cela me semble clair et acceptable :) ! Effectivement je me rends compte que d'amender un commit n'est pas une bonne pratique et rajoute du bruit pour les autres contributeurs (notification mail, etc.) en plus de l'insécurité, augmentation du délai.. Je tâcherai de faire attention à ces remarques lors de mes prochaines contributions. Merci d'avoir pris le temps et bonne journée, |
Je considère mergeable. Je vais faire un rebase et les modifications du Changelog et de setup avec pour objectif de merge dans l'après midi. |
Co-authored-by: Matti Schneider <matti@mes-aides.org>
prestations/depart1825.py
.Ces changements (effacez les lignes ne correspondant pas à votre cas) :
Quelques conseils à prendre en compte :
setup.py
.CHANGELOG.md
.Et surtout, n'hésitez pas à demander de l'aide ! :)