If statement 重构重复If语句块
我有一些代码要重写。该代码被设计为通用代码,因为它可以被许多需要不同工作流的不同调用方使用。事情是这样的:If statement 重构重复If语句块,if-statement,conditional,If Statement,Conditional,我有一些代码要重写。该代码被设计为通用代码,因为它可以被许多需要不同工作流的不同调用方使用。事情是这样的: string globalA; int globalB; bool globalC; // Lots more globals in various shapes and forms void TheOneAndOnlyMethod(XmlBasedConfig config) { // Set all of the globals based on XML configura
string globalA;
int globalB;
bool globalC;
// Lots more globals in various shapes and forms
void TheOneAndOnlyMethod(XmlBasedConfig config) {
// Set all of the globals based on XML configuration
// ...
if (globalA.Length > 0)
// Do something relating to functionality 'a'
}
if (globalB > 0) {
// Do something relating to functionality 'b'
}
if (globalC) {
// You get the idea
}
}
一些调用者将设置globalA和globalB,因此执行相关if块中的任何操作。其他呼叫者将有无数的其他设置来做他们需要做的事情。调用者基本上只是一个带有设置的XML文件
维护/修改这段代码是一大难题。我知道一定有一个更干净,更简单,更少大脑爆炸的方法来做到这一点 首先,我将把每个if语句转换成一个名称反映其功能的方法。然后,不要根据XML文件内容设置全局变量,而是解析文件并按顺序调用适当的方法,而不是通过变量进行通信。首先,我要将每个if语句转换为一个名称反映其功能的方法。然后,不要根据XML文件内容设置全局变量,而是解析文件并按顺序调用适当的方法,而不是通过变量进行通信。方法的名称可以让您深入了解问题/解决方案:ONANDONLYMETHOD。听起来您需要将代码分解为许多较小的方法,每个方法都处理非常特定的操作,并且可以重用
string globalA;
int globalB;
bool globalC;
// Lots more globals in various shapes and forms
void TheOneAndOnlyMethod(XmlBasedConfig config) {
// Set all of the globals based on XML configuration
loadXmlAsGlobals(config);
if (globalA.Length > 0)
methodOne(globalA);
methodTwo(globalA);
}
if (globalB > 0) {
methodTwo(globalB);
methodThree(globalB);
}
if (globalC) {
methodOne(globalC);
methodFour(globalC);
}
}
方法的名称提供了对问题/解决方案的一些见解:oneandonlymethod。听起来您需要将代码分解为许多较小的方法,每个方法都处理非常特定的操作,并且可以重用
string globalA;
int globalB;
bool globalC;
// Lots more globals in various shapes and forms
void TheOneAndOnlyMethod(XmlBasedConfig config) {
// Set all of the globals based on XML configuration
loadXmlAsGlobals(config);
if (globalA.Length > 0)
methodOne(globalA);
methodTwo(globalA);
}
if (globalB > 0) {
methodTwo(globalB);
methodThree(globalB);
}
if (globalC) {
methodOne(globalC);
methodFour(globalC);
}
}
这取决于您的XML文件结构。如果我可以访问A/B/C/。。。另外,我的c++/boost代码是这样的 重构类功能A中所有与A相关的内容 ,B类功能中的相关内容B。。。 FunctionalProvider类是用于配置系统功能的类。 OneAndonlyMethod要求提供者提供所有功能并对其进行迭代
class XmlFunctionality
{
public:
virtual ~XmlFunctionality(){
}
virtual void loadFromConfig(XmlBasedConfig) = 0;
virtual bool isEnabled() const = 0;
virtual void execute() = 0;
protected:
XmlFunctionality(){
};
}
class FunctionalityA : public XmlFunctionality
{
public:
void loadFromConfig(XmlBasedConfig){
// load A information from xml
}
bool isEnabled() const{
return globalA.length()>0; // is A a global !?
}
void execute(){
// do you're a related stuff
}
}
class FunctionalityB : public XmlFunctionality
{
public:
void loadFromConfig(XmlBasedConfig){
// load B information from xml
}
bool isEnabled() const{
// when is b enabled ...
}
void execute(){
// do you're b related stuff
}
}
// Map your question to the functions -
class FunctionalityProvider
{
Functionality functionalityList;
public:
typedef std::vector<XmlFunctionality*> Functionality;
FunctionalityProvider() : functionalityList() {
functionalityList.push_back( new FunctionalityA);
functionalityList.push_back( new FunctionalityB);
functionalityList.push_back( ... );
}
~FunctionalityProvider {
for_each( functionality.begin(), functionality.end(), delete_ptr() );
}
Functionality functionality() const {
return functionalityList;
}
}
void TheOneAndOnlyMethod(XmlBasedConfig config, const FunctionalityProvider& provider) {
const FunctionalityProvider::Functionality functionality = provider.functionality();
for_each(
functionality.begin(),
functionality.end(),
bind(&XmlFunctionality::loadFromConfig, _1, config)); // or some other way of parsing the file
for_each(
functionality.begin(),
functionality.end(),
if_then( bind(&XmlFunctionality::isEnabled, _1), bind(&XmlFunctionality::execute, _1)));
}
如果我不能单独访问A/B/C,我会让解析器根据XML文件的内容返回功能列表。这取决于您的XML文件结构。如果我可以访问A/B/C/。。。另外,我的c++/boost代码是这样的 重构类功能A中所有与A相关的内容 ,B类功能中的相关内容B。。。 FunctionalProvider类是用于配置系统功能的类。 OneAndonlyMethod要求提供者提供所有功能并对其进行迭代
class XmlFunctionality
{
public:
virtual ~XmlFunctionality(){
}
virtual void loadFromConfig(XmlBasedConfig) = 0;
virtual bool isEnabled() const = 0;
virtual void execute() = 0;
protected:
XmlFunctionality(){
};
}
class FunctionalityA : public XmlFunctionality
{
public:
void loadFromConfig(XmlBasedConfig){
// load A information from xml
}
bool isEnabled() const{
return globalA.length()>0; // is A a global !?
}
void execute(){
// do you're a related stuff
}
}
class FunctionalityB : public XmlFunctionality
{
public:
void loadFromConfig(XmlBasedConfig){
// load B information from xml
}
bool isEnabled() const{
// when is b enabled ...
}
void execute(){
// do you're b related stuff
}
}
// Map your question to the functions -
class FunctionalityProvider
{
Functionality functionalityList;
public:
typedef std::vector<XmlFunctionality*> Functionality;
FunctionalityProvider() : functionalityList() {
functionalityList.push_back( new FunctionalityA);
functionalityList.push_back( new FunctionalityB);
functionalityList.push_back( ... );
}
~FunctionalityProvider {
for_each( functionality.begin(), functionality.end(), delete_ptr() );
}
Functionality functionality() const {
return functionalityList;
}
}
void TheOneAndOnlyMethod(XmlBasedConfig config, const FunctionalityProvider& provider) {
const FunctionalityProvider::Functionality functionality = provider.functionality();
for_each(
functionality.begin(),
functionality.end(),
bind(&XmlFunctionality::loadFromConfig, _1, config)); // or some other way of parsing the file
for_each(
functionality.begin(),
functionality.end(),
if_then( bind(&XmlFunctionality::isEnabled, _1), bind(&XmlFunctionality::execute, _1)));
}
如果我不能单独访问A/B/C,我会让解析器根据XML文件的内容返回一个功能列表。您需要globals做什么?globals的含义是什么,它们来自哪里?参数'config'是如何使用的?参数实际上是一个DOM对象,表示XML配置。全球。。。我不知道为什么它们是全球性的,我想问原著作者同样的问题。你需要全球性的东西做什么?全球性的意义是什么,它们来自哪里?参数'config'是如何使用的?参数实际上是一个DOM对象,表示XML配置。全球。。。我不知道他们为什么是全球人,我也很想问原作者同样的问题。全世界的人都在制造麻烦。所有的麻烦都是全球性的。