Peut-être se trouve-t-il dans la boucle de messages d'un pilote de périphérique et le codeur d'origine, il y a peut-être 10 ans, ne voulait pas de sauts dans le code. J'espère qu'il a vérifié que son compilateur n'implémentait pas l'opérateur ternaire avec des sauts !
En examinant le code, ma première remarque est qu'une séquence d'opérateurs ternaires est -- comme tout code -- plus lisible lorsqu'elle est correctement formatée.
Cela dit, je ne suis pas sûr d'avoir analysé correctement l'exemple du PO, ce qui va à son encontre. Même une construction traditionnelle if-else imbriquée serait difficile à vérifier. Cette expression viole le paradigme fondamental de la programmation : Diviser et Conquérir.
req.security_violation
? dis_prot_viol_rsp && is_mstr
? uvc_pkg::MRSP_OKAY
: uvc_pkg::MRSP_PROTVIOL
: req.slv_req.size()
? is_mst_abort_rsp && dis_mst_abort_rsp
|| req.slv_req[0].get_rsp_status()==uvc_pkg::MRSP_PROTVIOL
&& dis_prot_viol_rsp
|| is_mst_abort_rsp && req.is_pci_config_req() && dis_pcicfg_mst_abort_rsp
? uvc_pkg::MRSP_OKAY
: req.slv_req[0].get_rsp_status()
: uvc_pkg::MRSP_OKAY;
Je voulais vérifier comment le code se présente une fois remanié. Il n'est certainement pas plus court, mais j'aime la façon dont les noms de fonctions parlantes rendent l'intention plus claire (bien sûr, j'ai deviné ici). Il s'agit, dans une certaine mesure, d'un pseudo-code, car les noms de variables ne sont probablement pas globaux, de sorte que les fonctions devraient avoir des paramètres, ce qui rend le code encore moins clair. Mais peut-être que le paramètre pourrait être un pointeur unique vers une structure d'état ou de requête ou autre (à partir de laquelle des valeurs telles que dis_prot_viol_rsp
ont été extraites). L'utilisation ou non d'un ternaire pour combiner les différentes conditions est à débattre. Je trouve que c'est souvent élégant.
bool ismStrProtoViol()
{
return dis_prot_viol_rsp && is_mstr;
}
bool isIgnorableAbort()
{
return is_mst_abort_rsp && dis_mst_abort_rsp;
}
bool isIgnorablePciAbort()
{
return is_mst_abort_rsp && req.is_pci_config_req() && dis_pcicfg_mst_abort_rsp;
}
bool isIgnorableProtoViol()
{
return req.slv_req[0].get_rsp_status()==uvc_pkg::MRSP_PROTVIOL && dis_prot_viol_rsp;
}
eStatus getRspStatus()
{
eStatus ret;
if( req.security_violation )
{
ret = ismStrProtoViol() ? uvc_pkg::MRSP_OKAY : uvc_pkg::MRSP_PROTVIOL;
}
else if( req.slv_req.size() )
{
ret = isIgnorableAbort()
|| isIgnorableProtoViol()
|| isIgnorablePciAbort()
? uvc_pkg::MRSP_OKAY
: req.slv_req[0].get_rsp_status();
else
{
ret = uvc_pkg::MRSP_OKAY;
}
return ret;
}
Enfin, nous pouvons exploiter le fait que uvc_pkg::MRSP_OKAY
est en quelque sorte la valeur par défaut et n'est écrasée que dans certaines circonstances. Cela élimine une branche. Regardez comment, après un peu de ciselage, le raisonnement du code est joliment visible : Si ce n'est pas une violation de la sécurité, regardez de plus près et vérifiez le statut réel de la demande, sans les demandes vides et les abandons ignorables.
eStatus getRspStatus()
{
eStatus ret = uvc_pkg::MRSP_OKAY;
if( req.security_violation )
{
ret = ismStrProtoViol() ? uvc_pkg::MRSP_OKAY : uvc_pkg::MRSP_PROTVIOL;
}
else if( req.slv_req.size()
&& !isIgnorableAbort()
&& !isIgnorableProtoViol()
&& !isIgnorablePciAbort()
)
{
ret = req.slv_req[0].get_rsp_status();
}
return ret;
}
0 votes
Est
exp_rsp_status
Constructible et cessible par défaut ?0 votes
En rapport : stackoverflow.com/questions/18237432/ o stackoverflow.com/questions/19020092/
0 votes
Votre question se concentre sur l'opérateur ternaire alors que le vrai problème ici est que c'est tout simplement beaucoup trop complexe, ternaire ou non.
5 votes
J'ai supprimé la balise [bad-code] car il s'agit d'une "métabalise", c'est-à-dire d'une balise qui décrit ce que la question doit contenir. est plutôt que ce dont il s'agit. Vous pourriez envisager de demander sur méta si vous voulez en discuter. Merci.
1 votes
Revenir continuellement sur les modifications avec lesquelles vous n'êtes pas d'accord n'est pas constructif. Si vous voulez discuter de la question de savoir si une modification doit rester ou disparaître, vous pouvez le faire sur Méta Stack Overflow plutôt que de s'engager dans une lutte acharnée.