有条件的like if(isFreeVersion)应该只在代码中发生一次。这不是一种模式,但是我确定您已经知道它的名称:它称为DRY原理。在代码if(isFreeVersion)中的多个位置放置类似“ ”的代码意味着您重复了这一行/其中的逻辑,这意味着应将其重构以避免重复。
“ if(isFreeVersion)”应用于设置不同功能的内部配置选项列表。结果代码如下所示:
if(isFreeVersion)
{
feature1Enabled=false;
feature2Enabled=false;
maxNoOfItems=5;
advertisingStrategy=new ShowLotsOfAdvertisementsStrategy();
// ...
}
else
{
feature1Enabled=true;
feature2Enabled=true;
maxNoOfItems=int.MaxValue; // virtually unlimited
advertisingStrategy=new ShowMinimalAdvertisementsStrategy();
}
这会将您的单个“ isFreeVersion”标志映射到不同的功能。请注意,如果功能控件需要更复杂的参数化,则可以在此处决定是要为单个功能使用单独的布尔标志,还是要使用某些其他参数,例如具有公共接口的不同策略对象。
现在,您可以在一处控制免费版本和付费版本中的内容,这使此逻辑的维护非常简单。您仍然必须小心,不要让您的代码被很多if(feature1Enabled)语句弄乱(遵循DRY原理),但是现在,维护此检查不再那么麻烦。例如,当您想使现有的付费功能免费时,您可以更好地控制需要更改的内容(反之亦然)。
最后,让我们看一下Fowler的博客中有关功能切换的文章,他在文章中谈到了功能进入点/切换点。让我列举一个中心点:
不要试图通过切换来保护新功能代码中的每个代码路径,而只专注于将导致用户进入那里的切入点并切换这些切入点。
因此,作为整体策略,应将重点放在用户界面上,并将检查限制在使某个功能出现或消失所需的最少点数上。那应该保持您的代码基础干净,没有任何不必要的混乱。