现在,我知道这个问题非常注重意见,因为人们通常会以不同的方式设计他们的应用程序...但是,我想知道我是否做错了什么,或者在目标c编程社区中一般不赞成,或者您对经验丰富的obj c开发人员如何设计这种方式有任何建议......
LOCATION是一个结构,BULLET是一个在Constants.h头文件中定义的枚举,BulletV是UIView的子类,Bullet是NSObject的子类
我有以下代码:
#import "Bullet.h"
@implementation Bullet
@synthesize Type;
@synthesize Location;
@synthesize Strength;
- (id)initWithLocation:(LOCATION)location Type:(BULLET)type Strength:(int)strength
{
self = [super init];
if (self)
{
self.Location = location;
self.Type = type;
self.Strength = strength;
}
return self;
}
@end
@implementation BulletV
@synthesize Type;
- (id)initWithLocation:(LOCATION)location Type:(BULLET)type
{
self = [super initWithFrame:CGRectMake(location.x - 10.0, location.y - 2.0, 20.0, 40.0)];
if (self)
{
self.center = CGPointMake(location.x, location.y);
self.Type = type;
}
return self;
}
- (void)drawRect:(CGRect)rect
{
switch (self.Type)
{
case Normal:
self.backgroundColor = [UIColor redColor];
break;
default:
break;
}
}
@end
现在,我对MVC相对较新..但似乎保持模型和视图分离会产生大量重复,我讨厌我的代码..
例如,我们在这些实现块中使用了2个相同名称的属性(位置和类型)这一事实让我感到困扰,但我不知道如何在保持分离的同时以任何其他方式执行此操作在模型和视图之间。
此外,视图和模型的init方法都非常相似,但模型还包含一个强度参数。
我在编程时有一个非常注重java的思维模式,我喜欢为每个对象创建单独的文件,并且每个对象都有一个状态和某些动作。现在,这个新设计不允许在任何操作中使用这些标题,因为它们需要放在控制器中。
欢迎任何评论,如果这是你在应用程序中制作“子弹对象”(更像是一个矩形)的方式,那么随意评论,但这对我来说似乎不对。随意提供您的见解。
答案 0 :(得分:1)
如果您要重复使用OrangeView,您可以将其命名为FruitView,并传递一个Fruit对象超类,它将使用方法fruit.color而不是使用开关。
但是我看到你在做什么,颜色是一个视觉属性,而MVC教条要求你保持每个部分都是孤立的,所以你将子弹以小块方式走私。这不是面向对象的,或者更容易理解或测试。 OOP的一个好处就是在对象中思考,如果你要向自己展示你的代码,你会理解它更好地传递一个Bullet对象。
修改强>
计算机科学中的所有问题都可以通过另一层次的间接解决,除了间接层太多的问题。在一个小应用程序中,C知道M和V非常常见,而V知道M.在java服务器端,你创建一个bean只是为了提供视图,但在这么小的例子中这是不必要的。即使你可以在打开课程之前发现模式,它也会付出更多的努力,更多的课程,更多的间接性。并不总是适合每个应用程序。
Apple在Cocoa Core Competencies和Cocoa Fundamentals Guide中对此进行了讨论。
可以合并播放的MVC角色 一个物体,一个物体,为 例如,同时满足控制器 并查看角色 - 在这种情况下,它会 被称为视图控制器。在里面 同样的方式,你也可以 模型控制器对象。对于一些 应用程序,结合角色 这是一个可以接受的设计。
答案 1 :(得分:1)
我立即看到了一些我会改变的事情。
第一个命名约定。属性和实例变量通常以小写字符开头,而类以大写字符开头。类名应该是描述性的,因此BulletV会更清晰,因为BulletView,“BulletV”可能是“BulletView”,“BulletVelocity”,或者谁知道还有什么。
其次,我不允许视图对自己的位置负责。视图应该对其内容负责,但不需要知道它在其超级视图中的位置或其他任何内容。
相反,我会考虑哪种对象包含有位置的子弹;房间,楼层或其他什么。让该空间的视图定位它包含的任何项目符号的视图。单个BulletView只需要根据子弹的类型决定如何绘制自己。正如Jano建议的那样,这可能意味着您想要将子弹传递给视图的指定初始化器。
一旦你有责任分离,对于任何对象模型,包含子弹的空间来管理他们的位置以及可能的其他行为(如创建和销毁子弹)都是有意义的。