想象一下社交媒体应用程序,用户可以加入某些组以与其成员进行交互。所以在我的业务逻辑中,我有一个创建这样一个新组的函数:
public void createGroup(String groupname)
{
//check if group with the specified name already exists
if (!groupnameAlreadyExists(groupname))
{
//...code creating a new group with the specified name
}
}
当您仔细查看代码时,您会看到在创建新组之前,我会检查是否已存在具有指定名称的组。
我的问题:在代码的地方我调用上面的函数,我也检查一个具有指定名称的组是否已经存在,并根据我决定下一步做什么:
public void doStuff(String groupname)
{
if (groupnameAlreadyExists(groupname))
{
joinGroup(groupname);
}
else
{
createGroup(groupname)
}
}
所以事实上我仔细检查,如果该组已经存在或不存在。这个szenario的编程风格是什么?有没有办法确保错误安全,但没有仔细检查?
由于createGroup是一个公共方法,我会在那里检查,因为没有任何东西阻止从其他地方调用该方法而不通过“doStuff”进行“重复”检查。
如果createGroup是私有的,并且您检查了调用createGroup的所有方法,并且检查的时间/资源成本很高......那么我可能会从createGroup中删除该检查。
创建一个方法并将其名称设置为JoinOrCreateGroupIfNotExist
。
public JoinOrCreateGroupIfNotExist(string groupName){
if (groupnameAlreadyExists(groupname)) {
joinGroup(groupname);
}
else {
createGroup(groupname);
}
}
此方法确保您将创建一个组(如果不存在)。同时检查组是否存在或不进行一次。
如果你想要的是安全的错误,那么我不会因为有人想加入它而创建一个不存在的组。原因如下:
朋友:你应该加入“GroupFullOfReallyCoolPeople”。
我:加入“GroupFulllOfReelyCoolPeople”
App:恭喜,您加入了“GroupFulllOfReelyCoolPeople!”
我:为什么我是这里唯一的一个?
如果用户尝试加入不存在的组,则该例外是异常或至少是意外情况。据推测,用户正在搜索要加入的群组,然后当他们想要加入群组时,他们正在选择群组,而不是手动输入其名称。因此,加入不存在的组的请求将是意外的。如果发生这种情况,那么最好返回一条消息,说明该组不存在,并且可能会询问用户是否要创建它。
在这种情况下,我实际上会使用HashSet,因为如果它已经丢失,你已经创建了它,如果不是只使用现有的那个。这将保证您始终只有一个组名,并且您可以跳过第二个检查,例如总是在HashSet中创建一个组(如果它已经存在,没有任何反应),然后总是加入它。
沿着:
public void doStuff(String groupname)
{
groups.add(groupname) // groups would be a HashSet<string>
joinGroup(groupname)
}
检查越多,您就可以安全地消除代码所具有的分支越少,并且更容易维护。