创建MVC模型类的最佳实践

时间:2020-03-31 22:20:10

标签: ios swift oop model-view-controller

我要创建自己的Minesweeper游戏版本,但我想知道,创建类手机游戏的最佳方法是什么?

我有两个版本:

1。

class GameCell: UIButton {
    var bombCountAround: Int = 0
    var isBomb: Bool = false
}

2。

class GameCell {
    var bombCountAround: Int = 0
    var isBomb: Bool = false
    var button: UIButton!
}

哪种是OOP或MVC编码的更好方法?

2 个答案:

答案 0 :(得分:3)

如果您是在ViewController中创建这些public class Function1 : Disposable { public Function1(IService1 service1, ILogger logger) { // logger and service1 injected via autofac like normal // ... } [FunctionName(nameof(Function1))] public async Task Run([QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")]string myQueueItem) { //... ,我认为GameCell nature 是一个接受用户交互并会通过更新游戏做出响应的按钮板。因此,我想说第一种方法似乎更合理。

但是,如果您要在模型中创建GameCell,然后使用它们来创建UI,我相信您可能会使用类似第二种方法的方法,但是GameCell应该是您的属性GameCell

答案 1 :(得分:2)

我不推荐这两种模式中的任何一种。

一个人的模型应该没有任何视图引用(即,它应该没有UIKit引用)。您不想混淆视图(在屏幕上看到的诸如按钮,图像,铬等之类的东西)和模型(整个面板的抽象表示,代表哪些正方形有炸弹,哪些没有炸弹,哪些没有炸弹)方块仍处于隐藏状态,并且尚未被隐藏)。

FWIW,我个人也倾向于保留bombCountAround对于给定的行和列由Board计算的属性。它实际上不是任何给定正方形的属性,而是各个正方形之间的关系。从理论上讲,您可以拥有一个属性来捕获它,从而省去了即时进行重新计算的麻烦,但是查看周围八个单元格的计算开销却很小,以至于没有必要。


通过示例,我可能在板上有一个特定正方形的对象:

struct Square {
    var isBomb: Bool
    var isHidden: Bool
    var hasUserFlagged: Bool
}

此模型表示我们在创建视图时需要了解的有关该单元的所有信息。具体来说,该广场是否真的是炸弹,该广场是否仍被隐藏(例如,用户根本没有轻敲它),或者用户是否在该处植入了旗帜以表示他们认为那里是否存在炸弹?

顺便说一句,请注意,我没有在模型名称的任何地方使用Cell,因为它通常表示一个UIKit对象,例如集合视图单元格。该模型不必担心视图的实现(即您是使用集合视图单元格,还是仅使用堆栈视图中的按钮,还是仅使用带有约束的图像视图)。 Cell暗示一种视觉元素,而不是板上的抽象方块。

话虽如此,我们可能想要一个结构来代表所有这些正方形的整个棋盘,或者是一个Board来代表整个游戏棋盘:

struct Board {
    private var squares: [[Square]]

    init(width: Int, height: Int, bombCount: Int) {
        // build the squares array of array of `Square`, setting a certain number to have bombs
    }
}

extension Board {
    func isBomb(column: Int, row: Int) -> Bool {
        // look up to see if the `Square` at that row and column is a bomb or not
    }

    func howManyBombsNear(column: Int, row: Int) -> Int {
        // calculate how many nearby bombs there are
    }
}

现在,这可能不是正确的模型。也许您想将炸弹的位置从游戏时间统计信息中分离出来,以了解用户未隐藏的内容和带有标志的内容。这取决于您。

但重要的是,模型应该完全没有任何与视图相关的类型。视图是完全从模型中抽象出来的,因此您可以针对所关注的平台实施此视图(例如,非Catalyst macOS目标可能使用的视图集与iOS / iPadOS / tvOS目标完全不同)。 / p>

相关问题