【问题标题】:improving redundant if else query (maybe with design pattern?) AND reduce global variables?改进冗余 if else 查询(可能使用设计模式?)并减少全局变量?
【发布时间】:2016-04-09 11:16:32
【问题描述】:

我的代码运行良好,但对我来说似乎很业余。

1) 例如:我正在使用蓝牙,我总是检查是否有设备以及用户是否有连接。

 if isThereADevice != nil && isThereADevice.connected() {
   //do stuff via bluetooth
 } else {
   //do an alternative
 }

这个结构在我的“项目”中存在 > 25 个。找到更好的解决方案会很酷,但我的编码经验不是很好。我很乐意得到一些信息、代码 sn-ps 或想法,我可以用谷歌搜索:)

2) 第二个愚蠢的事情是,我有很多全局变量。这看起来不是很好的风格。

例如:在游戏开始时,用户选择了一块石头。这块石头有一个ID。总的来说,我有五个 UIViewController 并且在每个 UIViewController 中我都需要这个 ID。

我刚刚创建了一个 Globals.swift 并定义:

var globalID: String = "default"

同时我有超过 20 个全局变量,例如时间、回合、一些对象……我什么时候在 Swift 中使用全局变量?我使用它们吗? 我的 ID 问题有什么解决方案?

【问题讨论】:

    标签: ios swift design-patterns globals


    【解决方案1】:

    如果没有更多上下文,很难对您的问题给出可靠的答案,但希望我接下来要说的内容能够引导您走上正确的道路。

    听起来您有一个蓝牙服务,其中需要一个且只有一个它的类型。这可能是使用单例模式表示蓝牙服务的好机会。您还可以使用委托模式与应用程序中各种实体的蓝牙服务进行交互。

    更多信息:

    就 iOS 中的全局范围而言,请避免使用它。结构是用来表示 Swift 中的值,用它们来存储你的值!

    例如:

    struct UIConstants {
        var color           = UIColor.blackColor()
        var height: CGFloat = 10
    }
    

    您现在可以在任何地方使用它:

    class MyView: UIView {
    
        let constants = UIConstants()
    
        init(frame: CGRect) {
            super.init(frame: frame)
    
            self.backgroundColor = constants.color
        }
    }
    

    这样,如果您需要将更改应用于应用程序中的所有实体,这些值可以重复使用并在一个位置进行更改。

    希望这会有所帮助!

    【讨论】:

    • 只是出于兴趣:为什么我必须避免使用全局范围?我阅读了您的链接并得到了一个单例的解决方案。但区别在哪里?我的代码适用于这两种解决方案。
    【解决方案2】:

    对于第一部分,创建一个带有一些静态函数的蓝牙助手类,这些函数会为您执行此检查并接收一些块

    class BluetoothHelper {
       class func doStuffViaBluetooth(bluetoothDeviceAvailible: () -> (), bluetoothDeviceUnavailible: () -> ())
          if isThereADevice != nil && isThereADevice.connected() {
             bluetoothDeviceAvailible()
          } else {
            bluetoothDeviceUnavailible()
         }
    }
    

    然后可以这样调用

    BluetoothHelper.doStuffViaBluetooth(bluetoothDeviceAvailible: {
       //Do Bluetooth stuff
    }, bluetoothDeviceUnavailible: {
      //Handle error case
    })
    

    这不会减少代码中的行数,实际上会稍微增加代码行数,但这要抽象得多,而且您只需实现一次设备测试逻辑。这对您来说也更容易测试。

    至于答案二,我建议创建一个包含 Player 和 Rounds 等对象的数据模型,并在视图控制器之间传递这些对象。

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多