gpt4 book ai didi

ios - Objective-C对象设计模式

转载 作者:行者123 更新时间:2023-12-01 19:05:36 25 4
gpt4 key购买 nike

想知道人们如何在程序中设计对象并使用设计模式。

例如:

假设我有两种类型的汽车(宝马,奔驰)和两种颜色(黑色,白色),
但是颜色对象已经存在两种方法,分别是

[Color initWithBlack];
[Color initWithWhite];

在.h文件中定义两种方法
- (Car *)makeWithType:(NSString *)type;
- (Car *)makeWithType:(NSString *)type andColor:(NSString *)color;

在.m文件中
- (Car *)makeWithType:(NSString *)type
{
// default is black
return [self makeWithType:type andColor:@"black"];
}

- (Car *)makeWithType:(NSString *)type andColor:(NSString *)color
{
Car *car = [[Car alloc] init];
car.type = type;
switch(color) {
case "black":
[car addColor:[Color initWithBlack]];
break;
case "white":
[car addColor:[Color initWithWhile]];
break;
default:
break;
}
return car;
}

这是定义和实现对象的正确方法吗?

是否有任何依赖关系耦合松散或紧密?

如果过紧,如何改善设计以减少耦合?

最佳答案

假设汽车类型本身对汽车类别没有任何影响,那么您所拥有的将是正确的。

那里有一些缺陷,首先,- (Car *)makeWithType:(NSString *)type;方法可能应该是类方法而不是实例方法。将其作为实例方法无法达到拥有它的目的,因为需要初始化一个虚拟汽车,然后通过它来创建正确的汽车。

此外,如果在某个时候发现BMW可以拥有Benz所不能拥有的属性,那么子类化将更为合适。请注意,您仍然可以保留用于创建汽车的类似类方法,但是在其中,确定正确的子类并返回该类的实例。他们称之为类集群。例如,UIButton是一个类集群,它接受一个类型,并为给定类型返回合适的具体子类。

如果您有常量(例如汽车品牌或颜色),那么再没有其他事情了,除非颜色对象执行某些操作,否则最好对这些对象使用枚举而不是字符串和对象。这样做有几个优点,首先是清晰度,现在在查看Car头文件时尚不了解可用的类型/颜色。使用枚举,您可以立即看到可用的值。其次是正确性,使用字符串很容易出错,并且编译器也不会检查其正确性,使用枚举时,如果您使用的值未定义,则会收到大的红色警报。

总结一下,这是我在Car类中使用的标题(假设BMW和Benz只是类型,对汽车没有特殊含义)

typedef NS_ENUM(NSUInteger, CarMake) {
CarMakeBMW,
CarMakeBenz,
};

typedef NS_ENUM(NSUInteger, CarColor) {
CarColorBlack,
CarColorWhite,
};

@interface Car : NSObject

+ (Car *)makeWithType:(CarMake)make;
+ (Car *)makeWithType:(CarMake)make andColor:(CarColor)color;

@end

如果确实需要使用Color对象(顺便说一句,请注意 initWithWhi(t)e方法名称中有一个错字),那么您应该将该颜色传递给该方法,而不是将字符串传递给该颜色。通过在类方法中基于传入的枚举值创建合适的对象,也可以将上面的标题和颜色对象混合使用。

关于ios - Objective-C对象设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com