首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何不重复自己或如何在一个方法中改变一个简单的条件?

如何不重复自己或如何在一个方法中改变一个简单的条件?
EN

Stack Overflow用户
提问于 2013-03-21 00:18:36
回答 4查看 106关注 0票数 3

我有一个方法,我在我的实现中多次使用,只需非常简单的修改。我怎样才能避免重复自己呢?

代码语言:javascript
运行
复制
...
    while (!queue.isEmpty()) {
        Element pivot = queue.poll();
        elements.remove(pivot);
        for (Element a : elements) {
            if (areFriends(pivot, a)) {
                db.addRelation(a, pivot);
                queue.add(a);
                elements.remove(a);
            }
        }
    }
...

我想用一个新的areFriends条件,f.e。areEnemies(元素枢轴,元素a),并继续使用整个代码和数据结构。我试图提取一个void方法,但在这种情况下,我必须传递所有变量(db、queue等)。作为输入,它看起来像是一个反模式。你知道怎么解决这个问题吗?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-21 00:27:09

创建一个接口:

代码语言:javascript
运行
复制
public interface Relation 
{
    public void execute(Element a, Element b);
}


public class AreFriendsRelation implements Relation 
{
    public void execute(Element a, Element b) 
    {
        // Return the Relation result
    }    
}

public class AreEnemiesRelation implements Relation 
{
    public void execute(Element a, Element b) 
    {
        // Return the Relation result
    }    
}

将关系对象传递给您的方法:

代码语言:javascript
运行
复制
public void MyMethod(Relation myRelation) {
...
while (!queue.isEmpty()) {
        Element pivot = queue.poll();
        elements.remove(pivot);
        for (Element a : elements) {
            if (myRelation.execute(pivot, a)) {
                db.addRelation(a, pivot);
                queue.add(a);
                elements.remove(a);
            }
        }
    }

...
}
票数 3
EN

Stack Overflow用户

发布于 2013-03-21 00:25:56

您可以定义一个interface

代码语言:javascript
运行
复制
public interface IElementFunction
{
    public boolean execute(Element e1, Element e2);
}

以及将interface的实现(命名的或匿名的classes)传递给公共函数:

代码语言:javascript
运行
复制
private void commonFunction(IElementFunction ief)
{
    while (!queue.isEmpty()) {
        Element pivot = queue.poll();
        elements.remove(pivot);
        for (Element a : elements) {
            if (ief.execute(pivot, a)) {
                db.addRelation(a, pivot);
                queue.add(a);
                elements.remove(a);
            }
        }
    }
票数 3
EN

Stack Overflow用户

发布于 2013-03-21 00:25:13

您可以使用Command设计模式。使用方法public void checkElements(Element a, Element b)创建一个接口,并创建该接口的一些实例。在你的方法中,使用接口的方法,或者让你的方法接受一个接口实例作为参数,或者让它作为类成员。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15529068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档