编辑:感谢所有回复者。我应该在我的原始帖子中提到我不允许更改这些函数的任何规范,因此使用断言和/或允许取消引用 NULL 的解决方案是不可能的。考虑到这一点,我认为要么我使用函数指针,要么直接保留重复项。为了清楚起见,这次我想避免使用函数指针。
原文:我试图避免代码重复而不会失去清晰度。通常在从事特定任务(Uni-undergrad)时,我认识到这些功能模式返回,但并不总是具有“出色的工作”解决方案..
你们中的任何人建议我应该用这三个 C 函数做什么(指向函数、宏等),它们以相同的方式检查它们的一些参数以使检查更加模块化(它应该更加模块化,对吗?) ?
顺便说一句,这些是直接从硬件分配中获取的,因此它们的功能细节与我的问题无关,只是在函数顶部检查的参数。
teamIsDuplicateCoachName(Team team, bool* isDuplicate) {
TeamResult result = TEAM_SUCCESS;
if (!team || !isDuplicate) {
result = TEAM_NULL_ARGUMENT;
} else if (teamEmpty(team)) {
result = TEAM_IS_EMPTY;
} else {
for (int i = 0; i < team->currentFormations; ++i) {
if (teamIsPlayerInFormation(team->formations[i], team->coach)) {
*isDuplicate = true;
break;
}
}
}
return result;
}
TeamResult teamGetWinRate(Team team, double* winRate) {
TeamResult result = TEAM_SUCCESS;
if (!team || !winRate) {
result = TEAM_NULL_ARGUMENT;
} else {
int wins = 0, games = 0;
for (int i = 0; i < team->currentFormations; ++i) {
Formation formation = team->formations[i];
if (formationIsComplete(formation)) {
games += formation->timesPlayed;
wins += formation->timesWon;
}
}
double win = ( games == 0 ) ? 0 : (double) wins / games;
assert(win >= 0 && win <= 1);
*winRate = win;
}
return result;
}
TeamResult teamGetNextIncompleteFormation(Team team, Formation* formation,
int* index) {
TeamResult result = TEAM_SUCCESS;
if (!team || !formation || !index) {
result = TEAM_NULL_ARGUMENT;
} else {
*formation = NULL; /* default result, will be returned if there are no incomplete formations */
for (int i = 0; i < team->currentFormations; ++i) {
Formation formationPtr = team->formations[i];
if (!formationIsComplete(formationPtr)) {
*formation = formationPtr;
*index = i;
break;
}
}
}
return result;
}
任何关于如何(特别)避免代码重复的建议将不胜感激。
谢谢你的时间!:)