使用空类作为数据类型

时间:2015-04-02 05:26:09

标签: objective-c oop

我正在编写一个带有 SecretNumber 类的程序,该程序包含一个数字并且有一个方法可以返回猜测是否太低,太正确或正确。
Method返回三个对象之一的对象,定义如下:

@interface TooHigh : NSObject
@end
@implementation TooHigh
@end
@interface TooLow : NSObject
@end
@implementation TooLow
@end
@interface JustRight : NSObject
@end
@implementation JustRight
@end
然后

SecretNumber 猜测方法实现如下:

@implementation SecretNumber
{
    int Secret;
}
-(id) guessSecret:(int)g
{
    if (g>Secret) {
        return [[TooHigh alloc] init];
    } else {
        if (g<Secret) {
            return [[TooLow alloc] init];
        } else {
            return [[JustRight alloc] init];
        }
    }
}

所以我的问题是这被认为是一个很好的编程形式,或者我最好发回一个1,2,3或三个随机字符(一个意思是太高,另一个意思太低,等等)?

3 个答案:

答案 0 :(得分:1)

您可以使用-101来表示太低正确太高< / em>分别。这会减少你的代码大小,并且也很容易理解。

在这种情况下,它可以与条件< 0== 0> 0一起使用。

好的程序很简单,可以通过给定程序可以解决的任务数量(通用)来衡量,它有多小(可以测量为代码+文档大小)

答案 1 :(得分:1)

你需要的是一个枚举类型 - 这是一个简单的值类型(例如像int ,而不是像NSObject这样的引用类型)一组固定的文字值。例如:

typedef enum { TooLow, JustRight, TooHigh } GuessClasification;

定义新类型GuessClasification,其中包含三个值TooLowJustRightTooHigh

您可以在类头文件中放置此类型声明。

使用此方法会变成:

- (GuessClassification) guessSecret:(int)g
{
    if (g>Secret)
        return TooHigh;
    else if (g<Secret)
        return TooLow;
    else
        return JustRight;
}

您使用此类型与整数和其他值类型类似,因此您可以使用==测试相等性,在case语句中将文字用作switch值等。< / p>

HTH

答案 2 :(得分:0)

您的解决方案是OO编程的一个很好的例子,并利用多态性。不过,在我看来,它没有任何问题,对于你的简单例子,它是最复杂的“复杂”。这样做的方式。让我们讨论迄今为止用于解决您的情况的选项,从最简单的开始:

  1. 简单地返回一个int:就代码行而言,这是最简单的。 SecretNumber将返回-1,0或1,并且调用代码将必须打开这些值,提供处理每种情况的逻辑。这种方法的结论是返回的整数的含义不是很明显,新的情况将意味着修改调用SecretNumber类的所有类。

  2. 返回一个枚举:这比返回一个int更好,只是为了附加返回值的含义。可读性和理解力增加。但是,您仍然必须打开返回的枚举类型,并为每个枚举案例提供逻辑。

  3. 封装类中每个返回值的行为,并返回一个接口。这就是你所做的,减去行为部分(你的课程是空的&#39;)。这是OO&#39; (这并不是更好或更坏)这三者之一,因为你避免了切换返回类型。这种方式倾向于成为三者中最灵活的一种。如果您将来有不同的案例(比如,值为WAY到高,或者值WAY为低),您就不必触摸调用SecretNumber的代码。

  4. 无论哪种方式都有效。但是,我总是会使用枚举返回值而不是整数,如果情况足够复杂,请执行#3而不是#2