我正在寻找用于学习面向对象设计的良好资源(书籍/网站).我发现的每一个资源都在UML和RUP而不是OO设计上辅导我.头一本书的重复性让我不想阅读他们的任何书籍.我正在寻找一本类似于" 计算机程序的结构和解释 "的书,用于面向对象的设计,它可以达到教学OO的目的.我不喜欢任何特定的OO语言.
虽然我在OOAD有一些经验,但我是SOA的新手.
SOA设计的一个指导原则是"仅使用抽象类进行建模".从设计中忽略它们.抽象的使用可以有助于建模(分析阶段).
在分析阶段,我想出了一个BankAccount基类.从中派生的专业类是"FixedAccount"和"SavingsAccount".我需要创建一个服务,返回用户的所有帐户(帐户列表).应满足要求的服务结构应该是什么?
注意:如果您可以使用WCF提供代码演示,那将会很棒.
我一直在思考这个面向对象的设计问题已经有一段时间了,并且无法提出一个令人满意的解决方案,所以我想在这里向群众展示一些意见.
我有一个游戏类代表一个基于回合制的棋盘游戏,我们可以假设它与此问题的目的类似于垄断.在我的设计中,我有一个包含TakeTurn方法的Player类.
该游戏遍历所有球员 S和调用TakeTurn方法做一切必要的事情来完成转弯.我希望能够拥有n个玩家,并能够将其中的任意数量设置为计算机玩家.所以,我的想法是拥有一个HumanPlayer类和一个ComputerPlayer类,这两个类都派生自Player.
该游戏者只知道播放器,并简单的调用TakeTurn每个方法球员轮流.我的问题在于,ComputerPlayer对象可以完全自动化,即保持Monopoly示例,可以决定使用某种逻辑购买属性.现在,使用HumanPlayer对象,它需要从实际用户获得一个输入,以便能够购买一个属性,这似乎意味着一个不同的接口,并可能意味着他们不应该派生
如果没有让Game类明确知道各种Player类的实际实现,我就无法找到解决问题的好方法.我总是可以在Game类中假设只有人类和计算机玩家并且有效地关闭它以进行扩展,但它似乎不是好的OO编程.
对此有任何意见将不胜感激.
我将尝试在一个简单的例子中提出我的问题......
假设我有一个抽象的基类Car.Car有一个基本的Engine对象.我在抽象Car类中有一个方法StartEngine(),它将引擎的起始委托给Engine对象.
如何允许Car的子类(如法拉利)将Engine对象声明为特定类型的引擎(例如,TurboEngine)?我需要另一个Car class(TurboCar)吗?
我正在继承一个普通的旧Engine对象,我不能在我的Car子类中重新声明(或覆盖)它作为TurboEngine.
编辑: 我知道我可以在我的法拉利课程中将任何Engine的子类插入myEngine参考中...但是我怎样才能调用只有TurboEngine暴露的方法?因为myEngine是作为基础引擎继承的,所以没有包含任何turbo内容.
谢谢!
我有为HR系统开发的系统.有会计员工和程序员员工.在加入公司的第一个月,员工没有任何角色.一名员工可以同时是会计师和程序员.我有一个由以下代码显示的设计.
现在,我需要通过实现新功能来增强系统:
终止所有会计师.(终止表示将员工的状态设置为IsActive = false).问题是我不能在没有检查的情况下将所有会计师直接设置为非活动状态.我需要检查一下他是否还有其他角色.
如何重新构造这些类以使终止函数更自然OO?
UPDATE
我正在寻找一个有@AlexDev答案的EF Database First解决方案模型和数据库架构的答案.
C#代码
List<Accountant> allAccountants = Get All accountants from database
public class Employee
{
public int EmpID { get; set; }
public DateTime JoinedDate { get; set; }
public int Salary { get; set; }
public bool IsActive { get; set; }
}
public class Accountant : Employee
{
public Employee EmployeeData { get; set; }
}
public class Programmer : Employee
{
public Employee EmployeeData { get; set; }
} …Run Code Online (Sandbox Code Playgroud) 我最近进入函数式编程(FP)的世界,我想知道如何为中等大小的应用程序"思考功能"?特别是FP的分析和设计.
通过OOP,我们受过训练,可以根据对象,属性和关系进行思考.我们使用类和序列图对我们的分析/设计进行建模.但是,在设计FP时,相同的模型似乎不合适.函数式编程的等效建模范例是什么?看起来DFD可能很合适,但我可能错了.
例如:我正在考虑设计一个使用Haskell的棋盘游戏Monopoly的模拟,只是为了学习语言.在进行OOAD时,你会想到board包含items附加属性/方法的类.您player可以在类图中捕获各种其他对象及其关联关系.以及它们在序列图中的相互作用.但是,这些建模范例似乎并不适用于功能程序.那么只是"如何"在功能上建模?
注意:我正在寻找可以解释如何分析和设计功能程序的具体参考/示例,因为我来自面向对象的思维/建模方式.
我正在阅读一些我不熟悉的Java代码,但似乎很奇怪,如果一个类Deck(对于一副牌),它已经有一个数组的实例变量Cards,那么为什么要Deck扩展或继承Card呢?我认为只有当A是B时,A类才会继承B类(Cat因为猫是动物而继承动物).
代码如下:
public class Deck <T extends Card> {
private ArrayList<T> cards;
private int dealtIndex = 0; // marks first undealt card
public Deck() {
}
public void setDeckOfCards(ArrayList<T> deckOfCards) {
cards = deckOfCards;
}
public void shuffle() {
for (int i = 0; i < cards.size(); i++) {
[...]
}
public abstract class Card {
private boolean available = true;
/* number or face that's on card - a number 2 …Run Code Online (Sandbox Code Playgroud) 我正在学习Builder模式
在上面的链接(Java示例)中,我注意到Builder提供了构造多个组件的接口.除了调用它们之外,我们还调用了getProduct().
我不明白的一点是,为什么Director需要逐个调用所有这些组件构造方法并最终获得结果.
/** "Director" */
class Waiter {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) { pizzaBuilder = pb; }
public Pizza getPizza() { return pizzaBuilder.getPizza(); }
public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough(); // construct component 1
pizzaBuilder.buildSauce(); // construct component 2
pizzaBuilder.buildTopping(); // construct component 3
}
Run Code Online (Sandbox Code Playgroud)
}
为什么我们不在ConcreteBuilder类中包含构造组件1,2,3的代码,而不是在Director中,实际上消除了Director层.
我知道上述方法可能会将Builder模式转变为其他方式,但我不明白为什么Director会逐步完成工作.有什么好处?如果有多个导演,会有重复的代码,对吧?我可能不理解执行Builder模式背后的动机......
更新:Builder模式是否专注于在创建更大的复杂对象时提供可自定义组件选择?否则,截至目前,我没有看到引入额外层的重点,即主任.
即使是这种情况,Decorator模式也可能是通过动态定制组件来实现相同目标.在某处,我错过了Builder背后的那一点...... :(
ooad ×10
oop ×8
c# ×3
inheritance ×2
java ×2
.net ×1
car-analogy ×1
composition ×1
haskell ×1
soa ×1
wcf ×1