通过对象访问类方法

Zip*_*ppy 0 java class object instantiation

编辑:已编辑以提供更多特定代码

正如你所看到的,我的精灵绘图正在打破这个规则.

如果有人能够根据我的代码解释伪代码,我将非常感激(这是因为我已经阅读了很多关于这条规则的解释但是我仍然不明白为什么这是一个问题或如何做我的事情需要做的不破坏这条规则:-()

1)为什么这会导致我的代码出现问题?

&

2)请解释我正在尝试做的事情的另一种方法(同时保留一个专门用于加载我的资源和创建我的精灵对象的单独资源类).


通过2个或更多类对象访问对象有什么问题.我将通过一些代码解释:

这里我有3个类,从class2到另一个对象访问方法有什么问题,如下面的第三个类..........:

我的资源类

//Resource class
public Class Resource(){

    Bitmap myTexture;
    Quad mySprite;

public void LoadResources(){

    //Load graphics
    myTexture = BitmapFactory.decodeResource(view.getResources(), R.drawable.myBitmap);

    //Create my objects
    mySprite = new Quad();                //Create new Quad object
    mySprite.setTexture(myTexture);  //Set texture to this quad
    mySprite.setSize(100,100);           //Set size of this quad


    }  

}
Run Code Online (Sandbox Code Playgroud)

我的四级

public class Quad(){

//This custom class has the bulk of the code to create all of the Quads / Sprites

public void setTexture(Bitmap textre){
//etc.....
}

//etc....


}

public void draw(int x, int y){

//Draw code here

}
Run Code Online (Sandbox Code Playgroud)

最后,我的主要GLRenderer类:

public class MyGLRenderer implements GLSurfaceView.Renderer{

    Resource res;

    public MyGLRenderer(){

    res = new Resources();  //Create object to my resources

}

public voide onDrawFrame(){



    //Here is my main loop and I need to draw my sprites here, so........

    res.mySprite.draw(x, y);    //Draw my sprite

}
Run Code Online (Sandbox Code Playgroud)

chr*_*her 7

为什么有几个链式方法调用很糟糕

这违反了法律

这违反了称为demeter定律的编码实践.该法律规定您只应与"​​旁边的"课程交谈.

为什么这是一件坏事

这样做的原因是,通过调用其他几个类中的方法,您的类需要了解这些方法,并依赖于那些方法的变化.这称为紧密耦合.如果方法发生变化,则需要更改其他类中的大量代码.这被称为"霰弹枪手术",并不是程序中的理想功能!

可能的解决方案

研究代理设计模式.它主要用于为另一个类提供接口,它可能对您有所帮助.也许通过引用这两个对象,这个类可以为所有方法提供一个通用接口来通过并减少类之间的耦合.

编辑以帮助您的示例

你的例子实际上并不那么糟糕.你得到一个对象,然后对它进行方法调用.依赖项以一种形式出现:如果mySprite从类中删除该字段,则代码将无法正常工作,如果draw从sprit中删除该方法,则无法使用该方法.对我来说,最简单的解决方案是在Proxy method你的Resources类中添加一个,draw()它接受一个sprite参数作为参数.

其次,也许不是mySprite直接访问,而是可以通过方法.假设你有一个看起来像这样的成员:

private ArrayList<Quad> sprites = new ArrayList<Quad>();
Run Code Online (Sandbox Code Playgroud)

这意味着为了从外部访问这些精灵,您需要使用某种方法.现在,通过强制其他类通过这些方法进行通信,您可以减少耦合.这是因为原始类只需要知道另一个类中的一个方法,而另一个类将完成这项工作.然后你写了一个drawSprite看起来像这样的方法:

public void drawSprite(int index) // Index really is up to you {
      sprites.get(x).draw(); 
}
Run Code Online (Sandbox Code Playgroud)

现在我知道它可能有更多的参数,但它只意味着从你的MyGLRenderer类中调用一个方法,因此符合demeter定律,并减少类中的耦合.