第一部分:基础知识
面向对象
“类”(Class)和“对象”(Object)的联系和区别?请举例说明。
“类”(Class)和“元类”(Metaclass)的联系和区别?请举例说明。
什么是“单继承”(Single Inheritance)?有什么特点?
“抽象类”(Abstract class)和“接口”(Interface)有哪些区别?
举例说明在你熟悉的程序设计语言中,“多态”(Polymorphism)是如何实现的。
设计模式
什么是“模式”(Pattern)和“设计模式”(Design Pattern)?请举例说明。
在GoF Design Pattern中,有几大类模式?
“抽象工厂”(Abstract Factory)的特点和使用?
试述一下MVC模式的结构与特点?
试述一下架构模式中Layered Application的特点?
软件工程
试述你所熟悉的软件工程过程?
试述在开发阶段,可以通过哪些手段提高最终产品质量?
第二部分:分析设计
请用你熟悉的程序设计语言实现单链表并遍历
请用你熟悉的程序设计语言语言,实现一下“单体”(Singleton),并注释说明代码是如何保障它实现的。
在某计算系统的实现代码中,有如下的代码,其中使用了那些模式,各有什么特点?Runner1的基本功能是打印
表达式,Runner2是计算表达式,请根据Client中代码,添加必要的代码,并在对原有代码修改最少的情况下,
实现Runner2(提示:使用堆栈,Variable)。
public class Cient
{
public static void Call()
{
Node expression = new Mul(
new Add(new Literal(99), new Literal(11)),
new Div(
new Literal(1000),
new Sub(“-”, new Variable(“a”), new Variable (“b”)));
expression.Run(Runner1.Instance);
expression.Run(Runner2.Instance);
}
}
public interface IRunner
{
void Run(Literal node);
void Run(Variable node);
void Run(Add node);
void Run(Sub node);
// TODO:
}
public class Runner1
{
public static Runner1 Instance = new Runner1();
public void Run(Literal node) { Console.Write(node.Value); }
public void Run(Variable node) { Console.Write(node.Text); }
public void Run(Add node)
{
Console.Write(“+”);
node.Left.Run(this);
node.Right.Run(this);
}public void Run(Sub node)
{
Console.Write(“-”);
node.Left.Run(this);
node.Right.Run(this);
}
//TODO:
}
public class Runner2
{
public static Runner2 Instance = new Runner2();
// TODO:
}
public abstract class Node
{
protected Node(string text)
{
this.Text = text;
}
public abstract void Run(IRunner runner);
}
public class Literal : Node
{
public double Value { get ; set; }
public Literal (double val)
{
this.Value = val;
}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public class Variable : Node
{
public string Name { get ; set; }
public double Value { get ; set; }
public Variable (string name)
{
this.Name = name;
}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public abstract class Op : Node
{
public Node Left { get; set; }
public Node Right { get; set; }
public Op(Node left, Node right)
{
this.Left = left;
this.Right = right;
}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public class Add : Op
{
public Add (Node left, Node right) : base(left, right) {}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public class Sub : Op
{
public Add (Node left, Node right) : base(left, right) {}
public override void Run(IRunner runner) { Runner.Run(this); }
}
//TODO:
某电子商务网站,有一个功能需求是“下订单”(Place an Order),客户在线浏览的同时,选择一个或多个“
商品”(Product)或“服务”(Service),并确定每种产品或服务的“数量”(Quantity),作为一个“订单
”(Order)提交给系统。在订单中,系统统计该订单中所有商品或服务的单价作为“小计”(Subtotal),以
及“税”(Tax)后的“总计”(Total)。不同的商品或服务在不同“省”(Province)的“税率”(Tax Rate
)是不同的。请使用你熟悉的方法和工具进行分析,分析过程要尽可能清晰完整。如果你可以使用4+1 View描述
和分析,请尽量使用。数据库设计请使用UML或ER图。
备注:在完成以下试题后,若你有任何想法或反馈,可以在此处表述。
MetaShare Inc. Page 1
忽然感觉自己是个文盲,一题都不懂
要真的说出原理来,写出来,还真的费事
路过学习。
这位前辈,你好,这两天都在做这个面试题目,但是都是自己根据网文总结的,也可能有欠妥当,所以总结写成博客,希望可以让园友们帮我订正一下,自己做的面试题目还是比较少,有幸可以遇到这个问问,觉得很开心~~请移步到此处
“类”(Class)和“对象”(Object)的联系和区别?请举例说明。
类是具有一些共同特征的事物的集合,对象是这一集合某一个具体的事物,
如,学生是一个类,称为学生类,因为学生有姓名,班级,姓别,成绩,学号等这一些共同特征,
某一个学生就是这个类的一个对象,
类是对客观事物的抽象描述,对象是有这个类特征的一个具体事物
“类”(Class)和“元类”(Metaclass)的联系和区别?请举例说明。
元类就是用来创建这些类(对象)的,元类就是类的类
如:
MyClass = MetaClass()
MyObject = MyClass()
什么是“单继承”(Single Inheritance)?有什么特点?
单继承指一个类别只可以继承自一个父类。面向对象程序设计中的继承,可使得程序结构更加清晰,降低了编码和维护的工作量。如果一个类只能有一个父类,则这种继承关系称为单重继承;如果一个类可以有多个父类,则这种继承关系称为多重继承
“抽象类”(Abstract class)和“接口”(Interface)有哪些区别?
相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;
抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。
举例说明在你熟悉的程序设计语言中,“多态”(Polymorphism)是如何实现的。
面向对象的语言具有封装性、继承性、多态性
允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。
设计模式
什么是“模式”(Pattern)和“设计模式”(Design Pattern)?请举例说明。
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
在GoF Design Pattern中,有几大类模式?
1 Factory Pattern
2 Facade Pattern
3 Command Pattern
4 Strategy Pattern
5 Iterator Pattern
6 Adapter Pattern
7 Observer Pattern
8 Bridge Pattern
9 Singleton Pattern
“抽象工厂”(Abstract Factory)的特点和使用?
特点:
1.将对象的创建和使用进行了分离(创建型模式都具备的)
2.易于交互产品系列(一个工厂创建的是一套完整的产品系列)
3.有利于产品的一致性(在一个应用中只出现一个具体的工厂)
使用:
1.系统多于一个产品族
2.同一个产品族的产品是一起使用的
3.系统提供一个产品的库,所有的产品以同样的接口出现,从而是客户端依赖于接口,而不依赖于实现。
试述一下MVC模式的结构与特点?
MVC(Model View Controller)模型-视图-控制器
MVC是典型的平行关系,没有说谁在上谁在下的关系,模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。而各种验证什么的应该是在模型里处理了。它强制性的使应用程序的输入、处理和输出分开。MVC最大的好处是将逻辑和页面分离。
试述一下架构模式中Layered Application的特点?
设计模式可确保用已知和公认的解决方案处理常见问题,定义清晰严谨的架构,提高应用程序的可扩展性,可维护性和可重用性。介绍了架构模式中的Layered Application模式理论,然后以一个企业客户数据分析系统为例,应用Layered Application模式为该系统构建一个基于.NET框架的系统架构。
软件工程
试述你所熟悉的软件工程过程?
软件工程(SoftWare Engineering)的框架可概括为:目标、过程和原则。 (1)软件工程目标:生产具有正确性、可用性以及开销合宜的产品。正确性指软件产品达到预期功能的程度。可用性指软件基本结构、实现及文档为用户可用的程度。开销合宜是指软件开发、运行的整个开销满足用户要求的程度。这些目标的实现不论在理论上还是在实践中均存在很多待解决的问题,它们形成了对过程、过程模型及工程方法选取的约束。 (2)软件工程过程:生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程,还有管理过程、支持过程、培训过程等。 (3)软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。
试述在开发阶段,可以通过哪些手段提高最终产品质量?
代码优化,不断完善功能
第二部分:分析设计
请用你熟悉的程序设计语言实现单链表并遍历
create database Test--创建数据库
create table MyStudents --创建一个学生表MyStudents
(
FId int identity(1,1),
FName nvarchar(50) not null,
FGender nchar(2),--性别
FAge int,
FMath int ,--数学成绩
FEnglish int--英语成绩
)
go
--遍历:
insert into MyStudents(FName,FGender,FAge,FMath,FEnglish)
values(N'张兰','女',20,87,64);
insert into MyStudents(FName,FGender,FAge,FMath,FEnglish)
values(N'齐一韩','女',19,86,88);
insert into MyStudents(FName,FGender,FAge,FMath,FEnglish)
values(N'刘晓飞','女',20,85,66);
insert into MyStudents(FName,FGender,FAge,FMath,FEnglish)
values(N'杨巧巧','女',19,90,45);
insert into MyStudents(FName,FGender,FAge,FMath,FEnglish)
values(N'王静静','女',21,59,67);
insert into MyStudents(FName,FGender,FAge,FMath,FEnglish)
values(N'耿宇丹','女',20,59,78);
请用你熟悉的程序设计语言语言,实现一下“单体”(Singleton),并注释说明代码是如何保障它实现的。
单体模式的宗旨在于确保某个类只有唯一的一个实例,并且为该类提供一个全局的访问点。
1、定义一个异常类SingletonException:
public class SingletonException extends RuntimeException {
public SingletonException() {
super();
}
public SingletonException(String s) {
super(s);
}
}
2、
public class PrintSpooler {
static boolean instance_flag=false; //true if 1 instance
public PrintSpooler() throws SingletonException {
if (instance_flag)
throw new SingletonException("Only one spooler allowed");
else
instance_flag = true; //set flag for 1 instance
System.out.println("spooler opened");
}
public void finalize() {
instance_flag = false; //clear if destroyed
}
}
3、
public class singleSpooler {
static public void main(String argv[]) {
PrintSpooler pr1, pr2;
System.out.println("Opening one spooler");
try {
pr1 = new PrintSpooler();
} catch (SingletonException e) {
System.out.println(e.getMessage());
}
System.out.println("Opening two spoolers");
try {
pr2 = new PrintSpooler();
} catch (SingletonException e) {
System.out.println(e.getMessage());
}
}
}
结果:
Opening one spooler
printer opened
Opening two spoolers
Only one spooler allowed
在某计算系统的实现代码中,有如下的代码,其中使用了那些模式,各有什么特点?Runner1的基本功能是打印表达式,Runner2是计算表达式,请根据Client中代码,添加必要的代码,并在对原有代码修改最少的情况下,实现Runner2(提示:使用堆栈,Variable)。
public class Cient
{
public static void Call()
{
Node expression = new Mul(
new Add(new Literal(99), new Literal(11)),
new Div(
new Literal(1000),
new Sub(“-”, new Variable(“a”), new Variable (“b”)));
expression.Run(Runner1.Instance);
expression.Run(Runner2.Instance);
}
}
public interface IRunner
{
void Run(Literal node);
void Run(Variable node);
void Run(Add node);
void Run(Sub node);
// TODO:
}
public class Runner1
{
public static Runner1 Instance = new Runner1();
public void Run(Literal node) { Console.Write(node.Value); }
public void Run(Variable node) { Console.Write(node.Text); }
public void Run(Add node)
{
Console.Write(“+”);
node.Left.Run(this);
node.Right.Run(this);
}
public void Run(Sub node)
{
Console.Write(“-”);
node.Left.Run(this);
node.Right.Run(this);
}
//TODO:
}
public class Runner2
{
public static Runner2 Instance = new Runner2();
// TODO:
}
public abstract class Node
{
protected Node(string text)
{
this.Text = text;
}
public abstract void Run(IRunner runner);
}
public class Literal : Node
{
public double Value { get ; set; }
public Literal (double val)
{
this.Value = val;
}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public class Variable : Node
{
public string Name { get ; set; }
public double Value { get ; set; }
public Variable (string name)
{
this.Name = name;
}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public abstract class Op : Node
{
public Node Left { get; set; }
public Node Right { get; set; }
public Op(Node left, Node right)
{
this.Left = left;
this.Right = right;
}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public class Add : Op
{
public Add (Node left, Node right) : base(left, right) {}
public override void Run(IRunner runner) { Runner.Run(this); }
}
public class Sub : Op
{
public Add (Node left, Node right) : base(left, right) {}
public override void Run(IRunner runner) { Runner.Run(this); }
}
//TODO:
某电子商务网站,有一个功能需求是“下订单”(Place an Order),客户在线浏览的同时,选择一个或多个“商品”(Product)或“服务”(Service),并确定每种产品或服务的“数量”(Quantity),作为一个“订单”(Order)提交给系统。在订单中,系统统计该订单中所有商品或服务的单价作为“小计”(Subtotal),以及“税”(Tax)后的“总计”(Total)。不同的商品或服务在不同“省”(Province)的“税率”(Tax Rate)是不同的。请使用你熟悉的方法和工具进行分析,分析过程要尽可能清晰完整。如果你可以使用4+1 View描述和分析,请尽量使用。数据库设计请使用UML或ER图。
创建一个Product表
create table Product
{
PId int identity(1,1),
PName nvarchar(50) not null,
Quantity int(8) not null--数量”(Quantity),
}
备注:在完成以下试题后,若你有任何想法或反馈,可以在此处表述。
MetaShare Inc. Page 1