系统设计问题是科技公司在访谈中倾向于询问的一类问题,以及更常见的基于algorythmic和知识的问题.该术语涵盖了抽象的面向对象设计
勾勒出垄断游戏的类图
还有更多关于以性能为导向的问题
您如何为大型Facebook游戏设计事件记录系统?
现在越来越多的这些问题涉及并发和分布式计算的主题.这些类型问题的问题是 - 很难找到好的资源.与algorthmic问题不同,没有在线评委会立即告诉您是否做得对.在像careercup这样的网站上发布的问题没有回答或不可靠.涉及系统设计的书籍范围太宽,无法用于面试准备.那么:你如何准备系统设计问题,而不是设计系统几年?有在线教程吗?问题 - 答案(解释) - 类型指南?
在一些公司的采访中,我被问到这个问题.
您知道哪些设计模式......然后我被告知要编写基于MVC设计模式的最简单的"hello world"应用程序.
我想出了一个JavaScript程序
var arr = ["a","b","c","d"]; // this is an array, same as store or model
alert(arr[0]); // this is controller
//and browser alert is a view.
Run Code Online (Sandbox Code Playgroud)
后来我被告知警报是一种观点.关于MVC的基本概念,我知道模型中的任何更改都会报告给View.并且中间有一个控制器来调用方法.
你能否纠正我的方法,或者为hello world MVC应用程序提出替代解决方案.还解释了MVC的细微方面.
谢谢.
javascript model-view-controller design-patterns object-oriented-analysis
在我的一个项目中,我有两个"数据传输对象"RecordType1和RecordType2,它们继承自RecordType的抽象类.
我希望两个RecordType对象在"process"方法中由同一个RecordProcessor类处理.我的第一个想法是创建一个通用的流程方法,该方法委托给两个特定的流程方法,如下所示:
public RecordType process(RecordType record){
if (record instanceof RecordType1)
return process((RecordType1) record);
else if (record instanceof RecordType2)
return process((RecordType2) record);
throw new IllegalArgumentException(record);
}
public RecordType1 process(RecordType1 record){
// Specific processing for Record Type 1
}
public RecordType2 process(RecordType2 record){
// Specific processing for Record Type 2
}
Run Code Online (Sandbox Code Playgroud)
我读过Scott Meyers在Effective C++中写了以下内容:
"任何时候你发现你自己编写的形式的代码'如果对象是T1类型,那么做一些事情,但如果它是T2类型,那么做一些其他的事情,'打自己."
如果他是对的,显然我应该打自己.我真的没有看到这是多么糟糕的设计(除非当然有人将RecordType子类化并添加到RecordType3而不向处理它的通用"Process"方法添加另一行,从而创建一个NPE),以及我能想到的替代方案涉及将特定处理逻辑首当其冲地放在RecordType类本身中,这对我来说真的没有多大意义,因为理论上我可以对这些记录执行许多不同类型的处理.
有人可以解释为什么这可能被视为糟糕的设计并提供某种替代方案,仍然负责将这些记录处理到"处理"类?
更新:
return null以throw new IllegalArgumentException(record);最近我遇到了一些代码,它们将子类型声明为基类中的枚举.这是一个简单的例子:
public enum EmployeeType
{
Manager,
Secretary
}
public class Employee
{
public string Code { get; set; }
public EmployeeType Type { get; set; }
}
public class Manager : Employee
{
public void Manage()
{
// Managing
}
}
public class Secretary : Employee
{
public void SetMeeting()
{
// Setting meeting
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的开发经验,我写了一篇关于它的文章,宣称这是一个糟糕的做法/设计.我认为这很糟糕,因为基类应该与其子类无关.它应该没有关于其子类的信息,这至少有两个原因:
Developer例如,您还应该更新EmployeeType您可能无权访问的枚举.矛盾的定义:现在你可以编写这段代码:
Secretary secretary = new Secretary();
secretary.EmployeeType = EmployeeType.Manager;
/*
This is absurd semantically. …Run Code Online (Sandbox Code Playgroud)我一直听到对象这个术语有行为和状态,或只是其中之一.但是有什么区别或者它意味着什么,如果有人能举一个例子,我会非常感激.
我刚刚开始了一个项目,让我的雇主成为管理软件.我有一个琐碎,但可能很简单的查询,我似乎无法找到任何信息.
在对象之间建立双向"关系"是谨慎/良好的做法.那么,例如,一个Client对象'有一个' Site,然后Site'有一个' Client,其中Client对象是Client'有'的Site?
public class Client {
Site site;
}
public class Site {
Client client;
}
Run Code Online (Sandbox Code Playgroud)
这有什么令人反感的(没有双关语意),还是没事?我目前正在为该项目创建一个模拟UML,这一直困扰着我.
目前我正在通过Head First Java学习Java,并开始展望更多有关OOP /设计模式的内容.
我的问题是在Head First Java之后应该追求哪本书.我在Head First Design Patterns和Head First Object Oriented Analysis and Design之间徘徊不前.毫无疑问,我可能应该阅读这两个,但我不确定两者之间的区别是什么,哪个更适合作为Head First Java的后续版本.
任何阅读这些建议或细节的人都将不胜感激.
有两种方法可以为scala中继承相同特征的两个不同类定义方法.
sealed trait Z { def minus: String }
case class A() extends Z { def minus = "a" }
case class B() extends Z { def minus = "b" }
Run Code Online (Sandbox Code Playgroud)
替代方案如下:
sealed trait Z { def minus: String = this match {
case A() => "a"
case B() => "b"
}
case class A() extends Z
case class B() extends Z
Run Code Online (Sandbox Code Playgroud)
第一种方法重复方法名称,而第二种方法重复类名称.我认为第一种方法最好使用,因为代码是分开的.但是,我发现自己经常使用第二个方法来处理复杂的方法,因此可以非常容易地添加其他参数,例如:
sealed trait Z {
def minus(word: Boolean = false): String = this match {
case A() => …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android项目.我已经搜索过高低,但我无法找到一个好的策略来拆分和打包我的代码.
我的问题是我有内部类使用主类变量,我无法弄清楚如何解耦它们.
我试图创建辅助类,但是我要么通过构造函数传递很多变量,要么暴露我的主类,我也不想这样做.
我想将每个类的最大代码行保持为150.目前,它是278.我正在寻找解耦这些的想法,特别是如何重构类以保留抽象(private变量).这方面的Java最佳做法是什么?
举个例子,这是我的主要课程之一MainActivity,约300行.
java android packaging inner-classes object-oriented-analysis