我认为编程C#语法非常好.我现在正在寻找的是一些资源,书籍(首选),网站,博客,它们处理设计面向对象的桌面应用程序和Web应用程序的最佳方式,特别是涉及数据和数据库时.
谢谢
我正在读这本书(Head First Object Oriented Design&Analysis).在第5章中有一个建议,我想对此有一些其他的强硬态度.这本书说:
"如果您有一组不同对象的属性,请使用集合(如Map)动态存储这些属性."
更进一步,解释为什么这样做:
"您将从类中删除大量方法,并避免在将新属性添加到应用程序时更改代码".
我确实理解这种方法的优点但是也没有缩小尺寸吗?我的意思是如果我使用地图来存储这些信息(在示例中它是一个String to Enum map)并提供一个getProperty(String)方法来访问,这个方法的调用者实际上必须知道允许哪些字符串.我不喜欢这个.我的意思是你当然可以争辩说可以在javadoc中说明哪个输入是允许的.
这真的是处理这类问题的方法有没有其他选择?我知道用继承做这件事并不好,因为大量的子类和那些子类不会覆盖任何东西只是添加新的属性,这在我的意见中并不是那么好.
请不要介意我的问题,因为它有点理论化.
上周我接受了一份工作面试,在那里我接到了一份工作,后来他们提问并且我的设计有问题.所以我无法得到这份工作.我正在分享我的设计.请看看它,并建议我在哪里错了,什么解决方案将是一个很好的设计.
问题 这是一个建造游泳池的建筑公司的包裹.游泳池有2个游泳池周边区域和游泳池.两个(泳池和周围区域)可以是矩形或圆形(请参见附图),因此将有4种可能的形状.程序应计算阴影区域(池到混凝土的外部区域).
****计算矩形区域**的公式**是长度*宽度*2 计算圆形区域的公式是2*2.1718
我的设计 我使用2种方法制作了IPool接口(1)CalculateCircularArea(2)CalculateRectangularArea.制作2个类(CircularPool,RectangularPool)实现IPool接口.
问题 如果除了矩形和圆形之外还有更多形状,该怎么办?如果还有其他100种形状,那么什么解决方案将考虑未来的招股说明书?在这里,我的设计并不好,因为当需要改变新的形状时,它需要改变界面.
我有以下课程:
类验证器{
私有最终SchemaFetcher schemaFetcher;
@注入
验证程序(SchemaFetcher schemaFetcher){...}
}
class DatabaseSchemaFetcher类实现SchemaFetcher {
@Override
架构loadSchema(final SchemaDefinition schemaDef);
@Override
boolean compareSchemaWithSource(最终SchemaDefinition schemaDef,最终Schema UpdatedSchema);
}
这只是示例之一,我还有其他类似的类,我将它们作为依赖项注入到其他类中。但这使我的SchemaFetcher类像一个单例,并且我一直将schemaDefinition传递给它的每个方法。这似乎非常程序化,我想将SchemaDefinition实际上作为DatabaseSchemaFetcher类的实例变量,但是在那种情况下,我将无法将SchemaFetcher对象注入到Validator类中,而应该这样做
validate(String schemaName){
SchemaDefinition schemaDef = buildSchemaDefinitionFrom(schemaName);
SchemaFetcher fetcher =新的DatabaseSchemaFetcher(schemaDef);
}
但这使我与提取程序紧密耦合,这就是为什么我想首先使用依赖注入的原因。
我可以看到我可能有一个默认的构造函数,用于DatabaseSchemaFetcher,然后有一个setSchemaDefintion()设置器来实现此目的,但是这违反了使用构造器完全构建对象的原则。
我该如何改进它使其不具有程序样式的访存器,而又将我的依赖项注入到构造函数中?我更喜欢构造函数注入,因为它可以清楚地定义我的依赖关系,而无需任何人研究类的实现来弄清楚该类在使用工厂或服务定位符时所使用的依赖关系。
我有一个指向派生类对象的Base类指针.方法foo()在基类中是公共的,但在派生类中是私有的.基类foo()是虚拟的.因此,当我从Base类指针调用foo()时,Vptr Table具有派生类foo()的地址,但它在Derived类中是私有的...所以如何调用它.
我理解运行时多态性,我也理解Access说明符适用于编译时,虚拟概念在运行时工作.所以应该没有编译器错误.
我的问题是:这是一个循环漏洞,通过它我们可以调用派生类的私有方法吗?或者预计会以这种方式行事.对此行为有任何好的解释.
非常感谢提前.
代码:
class A
{
public:
virtual void foo()
{
std::cout << "In A";
}
};
class B:public A
{
private:
void foo()
{
std::cout << "In B ??? Its Private Method :-( ";
}
};
int main()
{
A* ptr = new B();
ptr->foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我刚开始阅读应用 UML 和模式(第 2 版)这本书。GRASP 模式之一是信息专家,与 Modell 形式的 MVC 等效吗?
他们是否具有相同的职责(存储和检索信息)?
我有一个关于类和接口之间的关联建模的问题.据我所知,接口指定了对象可以做什么; 没有提供状态或功能(何时使用接口而不是抽象类,反之亦然?).此外,我的关于OOAD(James Rubaugh的面向对象建模和设计)的书指出,关联描述了一组在对象实例之间具有共同结构和通用语义的链接.
现在,假设我有以下实体:
1)ICar接口:定义汽车可以执行的操作
2)BMW:实现ICar界面的一类
3)IWheel:定义车轮功能的界面
4)LuxuryWheel:实现IWheel接口的类
现在,从设计的角度来模拟宝马和LuuryWheel之间的关系,您认为以下哪一项是正确的?我和每个人分享了我的想法
A)在ICar和Iwheel之间创建关联.BMW类可以创建LuxuryWheel类的具体实例.这是非常灵活的,但将车的能力与Wheel的能力相结合.此外,关联的定义表明关系是在实例之间.
B)在BMW类和LuxuryWheel类之间建立关联.解决特定问题; 但是宝马与豪华车轮紧密相连
C)在BMW类和Iwheel接口之间创建关联.这样宝马可以使用任何实现IWheel界面的类型.
选项C)对我来说看起来更好.请分享你的想法.
覆盖子接口中接口的方法/方法的原因是什么?
例如
interface I{ public void method();}
interface I2 extends I{@Override public void method();}
Run Code Online (Sandbox Code Playgroud) 这是从C++角度来看的一般设计问题.我有一个容器类,其中包含其他2个类的对象.
从容器类我们可以调用包含的类对象的方法"因为我们有包含的类对象的句柄",例如objContainedClass1-> SomeMthod();
但我想知道包含的类对象(objContainedClass1)将如何访问容器类的方法.
我可以想到以下方法:
容器类对象将指向自身的指针(this指针)传递给包含的类构造函数.使用此指针,包含的类可以访问容器类的方法.
将容器类中的某些函数设置为static.
实现这个的更多想法?
谢谢
我有一个可能需要处理数十亿个对象的应用程序.每个对象都是TRange类的类型.这些范围是在算法的不同部分创建的,这取决于某些条件和其他对象属性.因此,如果您有100个项目,则无法在不创建所有先前对象的情况下直接创建第100个对象.如果我创建所有(数十亿)对象并添加到集合中,系统将抛出Outofmemory错误.现在我想迭代遍历每个对象主要有两个目的:
如何在不提高Outofmemory的情况下为这些对象有效地创建迭代器?
我通过将函数指针传递给算法函数来处理第一种情况.例如:
procedure createRanges(aProc: TRangeProc);//aProc is a pointer to function that takes a //TRange
var range: TRange;
rangerec: TRangeRec;
begin
range:=TRange.Create;
try
while canCreateRange do begin//certain conditions needed to create a range
rangerec := ReturnRangeRec;
range.Update(rangerec);//don't create new, use the same object.
if Assigned(aProc) then aProc(range);
end;
finally
range.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
但是这种方法的问题在于,要添加一个新功能,比如检索我之前提到的Total权重,要么我必须复制算法函数,要么传递一个可选的out参数.请提出一些想法.
谢谢大家
普拉迪普
我正在重构一个用PowerBuilder和Java编写的现有应用程序,它运行在Sybase EA Server(Jaguar)上.我正在构建一个小框架来包装EA Server中可用的Jaguar API函数.其中一个类是使用Monitoring该类从EA Server获取运行时统计信息.
MonitoringEA Service API中的一个类提供了Jaguar运行时监控统计信息(实际的类是C++; EA Server在Java中为这些提供了包装,因此可以通过CORBA访问它们),而不需要太多细节.
以下是我班级的简化版本.(我创建了一个超类,我继承了它来获取组件,连接缓存,HTTP等的统计信息).
public class JagMonCompStats {
...
public void dumpStats(String type, String entity) {
private String type = "Component";
private String entity = "web_business_rules";
private String[] header = {"Active", "Pooled", "invoke"};
// This has a lot more keys, simplified for this discussion
private static short[] compKeys = {
(short) (MONITOR_COMPONENT_ACTIVE.value),
(short) (MONITOR_COMPONENT_POOLED.value),
(short) (MONITOR_COMPONENT_INVOKE.value)
};
private double[] data = null;
...
/* Call to Jaguar API */ …Run Code Online (Sandbox Code Playgroud) ooad ×11
oop ×5
java ×4
c++ ×2
architecture ×1
delphi ×1
easerver ×1
grasp ×1
refactoring ×1
uml ×1