objective-c - iOS : is there a way to use a single class to hold common variables and not break Object Oriented principles?

标签 objective-c oop

出于多种原因,我想在几个类中将数据与实现分开。

例如,一个原因是我有几个显示文本的不同菜单屏幕。我希望有一个类在一个地方列出所有菜单的所有文本,然后在初始化时从该类读取不同的菜单对象。

这样,无论何时我想进行更改,我都知道文本变量的确切位置,而且如果我愿意,我可以一次更改一堆。

我想以很多不同的方式使用相同的原则,例如,设置各种 UIView 的颜色和 alpha 值;将它们全部放在一个地方将使我能够协调它们的设置并非常轻松地进行小的调整。

除了这些原因之外,我正在与一个由其他开发人员组成的小团队合作,如果我们都知道我们将此类信息存储在一个地方,那么就更容易理解彼此的代码。

所以基本上我想要一个大的 UberData 类,每个其他类都可以读取和写入。

据我所知,唯一的方法是让每个需要的变量成为一个属性,所以我基本上会得到一个包含大量属性的大型无方法类。但据我所知,这有点违反 OO 规则,因为类应该尽可能多地隐藏它们的内部结构。更不用说整个事情看起来真的很糟糕。

所以问题是:是否有比拥有一百万个属性的类更好的方法来做到这一点,从 OO 的角度来看,这样做是否合适?

最佳答案

一个大的 UberData 类(实际上,如果您考虑属性,您指的是该类的一个实例)是错误的方法。

菜单字符串和 View 颜色之间有什么关系?没有。因此它们不属于同一类。

字符串

对于您的菜单字符串,查看 NSLocalizedString macro并创建一个 strings file .您可以创建一个 CommonStrings 类来包装对 NSLocalizedString 的所有调用:

@interface CommonStrings : NSObject

+ (NSString *)open;
+ (NSString *)save;
// etc.

@end

@implementation CommonStrings

+ (NSString *)open {
    return NSLocalizedString(@"open", @"menu item title for opening a file");
}

+ (NSString *)save {
    return NSLocalizedString(@"save", @"menu item title for saving a file");
}

// etc.

@end

这种方法意味着您只需在一处编写@"open",然后在需要(本地化)字符串时引用[CommonStrings open]。编译器会检查您是否正确拼写了 [CommonStrings open],这很好。

但是,最好还是将其分解为多个助手(一个用于应用的每个独立部分),而不是一个巨大的助手用于整个应用。如果您使用一个巨大的包罗万象的类,那么编译您的应用程序会花费更长的时间,因为每次您在此类中添加或删除方法时都必须重新编译很多内容。

UIView 颜色

首先,观看来自WWDC 2012的外观定制视频和 WWDC 2013并阅读 UIAppearance。也许您可以使用它来自定义应用的颜色。

如果这还不够,请在 UIColor 上为您应用的颜色创建一个类别:

@interface UIColor (MyApp)

+ (UIColor *)MyApp_menuBackgroundColor;
+ (UIColor *)MyApp_menuTextColor;
// etc.

@end

@implementation UIColor (MyApp)

+ (UIColor *)MyApp_menuBackgroundColor {
    return [self colorWithPatternImage:[UIImage imageNamed:@"menuBackgroundPattern"]];
}

+ (UIColor *)MyApp_menuTextColor {
    return [self colorWithWhite:0.0 alpha:1.0];
}

// etc.

@end

同样,为您的应用的不同部分设置多个帮助器类别可能会更好,这样您在添加或删除类别方法时就不必重新编译那么多。

关于objective-c - iOS : is there a way to use a single class to hold common variables and not break Object Oriented principles?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794642/

相关文章:

ios - MFMailComposeViewController:取消按钮不可见

ios - AVcaptureMetadataOutput 在 ios10 中不起作用

php - 将权限存储到多维数组php中

ios - 抽象方法在Objective-C中实现多态

java - 我如何允许作为接口(interface)实现的线程与 JWindow 对象进行通信?

objective-c - 向 XCode 5 项目添加测试时出现问题

javascript - javascript中带格式的字符串等价于什么

ios - 使用 block 语句检测失败的文件修改

python - 将类方法作为回调传递(面向对象编程 Python)

java - 使用 Java 探索 CSV