Tag: 干净代码

Swift解决方案:网桥

我想请您注意抽象汉堡包及其作为餐食的具体实现。 假设我们要添加一个新汉堡,您需要创建多少个其他类? 如果回答三个,那将是正确的: 两个层次 这是不直观的,但是避免这种混乱的解决方案是创建两个单独的层次结构。 这是定义在声明时的含义: 桥接模式将抽象与其实现分离开来…… “抽象”是指基类或协议。 在我们的示例中,它涉及各种汉堡类。 这些汉堡包不会被实例化,因为餐厅不会单独出售它们。 必须使用实现将它们分类为一顿完整的饭菜才能使用。 “实施”是指我们在将汉堡包加入餐边后制作的餐食类。 因此,我们将汉堡包(抽象)与餐食/面食(实现)分离,并剩下两个类层次结构。 层次结构之间的桥梁 然后定义继续说: 桥接模式将抽象与其实现分离, 以便两者可以独立变化。 现在我们有了两个单独的层次结构,我们需要一种连接两者的方法。 为此,我们为每个Burger赋予Side类型的属性。 这种“具有”关系是连接两个层次结构的“桥梁”。 我们这样做是为了使两者可以独立变化。 换句话说,我们不再需要为汉堡和面包的每个组合创建一个类。 由于它们的层次结构是分开的,因此每个新汉堡或一面只需要一个新类。 这一切似乎有点抽象,所以让我们回到代码中进行演示。 编码解决方案 我们需要针对设备和音频类型的单独层次结构。 让我们从音频类型开始: protocol AudioHandling { func handle(audio: Audio) -> Audio } class AudioEncryptor: AudioHandling { func handle(audio: Audio) -> Audio { // Encrypt and return Audio } } class PlainAudioHandler: […]

UITableView入门(有关编写简洁代码的提示)

将表视图添加到视图控制器并设置约束,如下所示。 拖动Table View Cell,并将Style设置为Right Detail,并将单元格标识符设置为’cell’。 稍后我们将相应地进行调整。 我通常按​​照上面显示的方法处理表视图,只是为了给我更大的灵活性。 运行模拟器,您可以看到我们的数据列表已正确填充。 请注意,我们正在使用提供给我们的4种基本样式之一。 继续尝试将tableview 样式更改为Subtitle,然后重新运行模拟器。 很好! 您已经使用一些数据创建了第一个表格视图! 我们已经获得了符合UITableViewDataSource和UITableViewDelegate协议的UIViewController,并将其设置为UITableView的数据源和委托。 这仅适用于几行代码,但可以想象如果UIViewController以后在应用程序中有更多事情要做,该类可能会变得肿。 它将承担太多责任,并且只会使其难以维护,阅读或测试。 因此,让我们继续重构代码。