[使用Java Runnable的不良类设计

问题描述 投票:0回答:1

您能否解释为什么在下面的程序中以这种方式实现Runnable接口是一个错误的设计决定?凭直觉,如果我必须自己编写此代码,则可以将Hotel设为自己的类,并在实现Runnable的新类中编写run()的规范。但是,我无法真正解释下面的代码为什么是错误的设计决策。

班级模拟了一个旅馆,里面有等候的人和一系列的房间。有几个在不同线程上运行的“办公桌”,每个办公桌负责将人员从队列中移出并检入可用的房间。为简单起见,不包括退房。方法的实现无关紧要(请相信它是线程安全的),此问题与将run()放入Hotel类的设计决策有关。

public class Hotel implements Runnable {
    private final static int NR_ROOMS = 10;
    private final Person [] rooms = new Person [ NR_ROOMS ];
    private final List < Person > queue = new ArrayList < >();
    private final Lock queueLock = new ReentrantLock ();

    private boolean occupied (int i) {
        return ( rooms [i] != null);
    }

    private int checkIn ( Person p) {
        // add Person to a free room
    }


    private void enter ( Person p) {
        // add a person to the waiting queue
    }

    // every desk employee should run as a separate thread
    @Override
    public void run () {
        // remove guests from the queue and check them in
    }
}

java multithreading thread-safety runnable design
1个回答
0
投票

OO编程的重点是创建对业务逻辑建模的类;由于您的问题有旅馆,房间,人等,因此您可能希望在您的问题域中有代表这些“名词”的类。然后,这些类上的方法表示对对象执行的操作。

我在Hotel类上使用run()方法遇到的直接问题是,根本不清楚酒店“运行”的含义。我认为在某些情况下可能有意义。例如,如果您进行了模拟,并且制定了规则,规定了随着时间的流逝该酒店将发生什么。不自然的是,酒店通常是发生事情的地方,而不是做事的地方。

就此而言,在我看来,旅馆的一个实例具有rooms的列表,每个列表的类型均为Person,这似乎太简单了。您可以通过这种方式使简单的逻辑工作,但是OO设计的原则之一是使扩展现有程序变得容易,因为您已经对问题域的实际对象进行了建模,因此,使用它们进行更多的处理将是比起没有,自然要容易得多。在这种情况下,如果旅馆有一个Room对象列表,然后每个Room对象可以包含一定数量的Person对象,对我来说,似乎可以更好地匹配已知的问题空间。然后,一个房间中的“人数”更加灵活,对于不同的房间,人数可能会有所不同,等等。

我全都希望从一个简单的系统开始,但是由于您正在询问面向对象的设计,所以我认为我将借此机会指出与此相关的这些问题。

© www.soinside.com 2019 - 2024. All rights reserved.