gpt4 book ai didi

C编程: how to avoid code duplication without losing clarity

转载 作者:行者123 更新时间:2023-12-02 21:43:26 24 4
gpt4 key购买 nike

编辑:感谢所有回复者。我应该在我原来的帖子中提到,我不允许更改这些函数的任何规范,因此使用断言和/或允许取消引用 NULL 的解决方案是不可能的。考虑到这一点,我认为要么使用函数指针,要么直接保留重复部分。为了清楚起见,这次我想避免使用函数指针。

原文:我试图在不失去清晰度的情况下避免代码重复。通常,在完成特定作业(大学 - 本科生)时,我会认识到这些函数 return 模式,但并不总是具有“出色的工作”解决方案。

你们中的任何人建议我应该用这三个 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;
}

任何有关如何(具体地)避免代码重复的建议将不胜感激。

感谢您的宝贵时间! :)

最佳答案

将空值传递给这些函数似乎是一个编码错误。处理这种情况的主要方法有3种。

  1. 处理错误的空值并返回错误值。这引入了额外的代码,用于检查参数以返回错误值,以及每个调用站点周围的额外代码,现在必须处理错误返回值。可能这些代码都没有经过测试,因为如果您知道代码错误地传递了空值,您只需修复它即可。
  2. 使用断言检查参数的有效性,从而产生干净的错误消息,清晰易读的前提条件,但有一些额外的代码。
  3. 没有前置条件检查,并在引用 NULL 时调试段错误。

根据我的经验,3 通常是最好的方法。它添加了零额外代码,并且段错误通常与从 2 中获得的干净错误消息一样容易调试。但是,您会发现许多软件工程师更喜欢 2,这是一个品味问题。

您的代码(模式 1)有一些明显的缺点。首先,它添加了无法优化的额外代码。其次,更多的代码意味着更多的复杂性。第三,尚不清楚这些函数是否应该能够接受损坏的参数,或者代码是否只是在出现问题时帮助调试。

关于C编程: how to avoid code duplication without losing clarity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19963395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com