基本套路

  1. 题目描述
    • 往往非常简单,如:设计一个XX系统。或者:你有没有用过XXX,给你看一下它的界面和功能,你来设计一个。
  2. 阐述题意
    • 面试者需向面试官询问系统的具体要求。如,需要什么功能,需要承受的流量大小,是否需要考虑可靠性,容错性等等。
  3. 面试者提供一个初步的系统设计
  4. 面试官这对初步的系统中提出一些后续的问题:如果要加某个功能怎么办,如果流量大了怎么办,如何考虑一致性,如果机器挂了怎么办。
  5. 面试者根据面试官的后续问题逐步完善系统设计
  6. 完成面试

总体特点是以交流为主,画图和代码为辅。

根据我们面试别人和参与面试的经验,先从面试官的角度给出一些考量标准:

  • 适应变化的需求(Adapt to the changing requirements )
  • 设计干净,优美,考虑周到的系统(Produce a system that is clean, elegant, well thought )
  • 解释为何这么实现(Explain why you choose this implementation )
  • 对自己的能力水平很熟练(Be familiar with your experience level to make decisions )
  • 在一些高层结构和复杂性方面有设计(Answer in high level of scale and complexity )

按照评分体系的化,分成下面4个等级

 

其实大家大可不必追求完美,在真正的面试中,没有人能对答如流,往往面试官也会给出善意的提示,就算你没回答某个子问题,在面试后的评价中也会综合衡量,跟其他的面试者比较,最终打出一个分数

解题策略

Abstractions, Object and Decoupling

通常,关于OOP,面试官会让面试者设计一个程序框架,该程序能够实现一些特定的功能。比如,如何实现一个音乐播放器,如何设计一个车库管理程序等等。对于此类问题,设计的关键过程一般包括抽象(abstraction),设计对象(object)和设计合理的层次/接口(decoupling)。这里,我们举一个例子简单说明这些过程分别需要做些什么,在“模式识别”给出更为具体和完整的实例。

继承/组合/参数化类型

在面向对象中最常用的两种代码复用技术就是继承和组合。在设计对象的时候,“Is-A”表示一种继承关系。比如,班长“Is-A”学生,那么,学生就是基类,班长就是派生类。在确定了派生关系之后,我们需要分析什么是基类变量(base class variables)什么是子类变量(sub class variables),并由此确定基类和派生类之间的联系。而“Has-A”表示一种从属关系,这就是组合。比如,班长“Has-A”眼镜,那就可以解释为班长实例中拥有一个眼镜实例变量(instance variable)。在具体实现的时候,班长类中定义一个眼镜的基类指针。“在生成班长实例的时候,同时生成一个眼镜实例,利用眼镜的基类指针指向这个实例。任何关于眼镜的操作函数都可以利用这个基类指针实现多态(polymorphism)。注意,多态是OOP相关的一个重要概念,也是面试常考的概念之一。关于多态的解释请见“工具箱”。

在通常情况下,我们更偏向于“Has-A”的设计模式。因为该模式减少了两个实例之间的相关性。对于继承的使用,通常情况下我们会定义一个虚基类,由此派生出多个不同的实例类。在业界的程序开发中,多重继承并不常见,Java甚至不允许从多个父类同时继承,产生一个子类。

此外,我们还要提及参数化类型。参数化类型,或者说模版类也是一种有效的代码复用技术。在C++的标准模版库中大量应用了这种方式。例如,在定义一个List的变量时,List被另一个类型String所参数化。

设计模式着重于代码的复用,所以在选择复用技术上,有必要看看上述三种复用技术优劣。

继承

  • 通过继承方式,子类能够非常方便地改写父类方法,同时
  • 保留部分父类方法,可以说是能够最快速地达到代码复用。
  • 继承是在静态编译时候就定义了,所以无法再运行时刻改写父类方法。
  • 因为子类没有改写父类方法的话,就相当于依赖了父类这个方法的实现细节,被认为破坏封装性。<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910115.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910115.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910115.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mumu模拟器鼠标侧键返回

把图片中的“点击鼠标右键“操作换成点侧键 参考文章&#xff1a;你们要的鼠标右键返回来啦【mumu模拟器吧】_百度贴吧

软件公司进军无人机领域的战略指南与生态合作全景-优雅草卓伊凡

软件公司进军无人机领域的战略指南与生态合作全景-优雅草卓伊凡 那么找到细分领域我们应该如何开始真正加入无人机开发的梯队呢&#xff0c;卓伊凡看了大疆创新加入成为认证开发者也是非常不错的选择。 引言&#xff1a;无人机产业的黄金机遇 根据德勤2023年全球无人机解决方…

键盘觉醒:Raycast 把 Mac 变成「AI 指令战舰」

在 Mac 上追逐效率的脚步&#xff0c;从未停歇。从早期的 Alfred 到系统内置的 Spotlight&#xff0c;这些工具虽好用&#xff0c;却总让人觉得功能边界清晰&#xff0c;变化有限。直到 Raycast 出现&#xff0c;彻底重塑了这个品类的想象空间。它集启动应用、查找文件、单位换…

宇宙尽头是WPS之——【Excel】一个自动重新排序的宏

1. 目的 你是否在做一个表格排序&#xff0c;但只能知道某几个行之间的相对顺序&#xff0c;而可能排着排着发现后面还有顺序更靠前的项&#xff0c;而不得不将排好的序号重新11…… 所以你需要一个宏&#xff0c;它可以知道你输入了一个已经存在的序号&#xff0c;并以那个序…

Sharding-jdbc使用(一:水平分表)

说明&#xff1a;Sharding-jdbc是常见的分库分表工具&#xff0c;本文介绍Sharding-jdbc的基础使用。 分库分表 首先&#xff0c;介绍一下分库分表&#xff1a; &#xff08;1&#xff09;分库 水平分库&#xff1a;以字段为依据&#xff0c;按照一定策略&#xff08;hash、…

处理器指令中的函数调用指令是什么?

处理器指令中的函数调用指令是什么? 函数调用指令是处理器指令集中用于实现函数(或子程序)调用和返回的专用指令。它们是支持结构化编程和代码复用的硬件基础。核心指令通常包括: 调用指令 (CALL / BL / BLX 等): 功能: 暂停当前函数的执行,跳转到目标函数(被调用函数)…

CHASE、CoSQL、SPARC概念介绍

CHASE&#xff1a;一个跨领域多轮交互text2sql中文数据集&#xff0c;包含5459个多轮问题组成的列表&#xff0c;一共17,940个<query, SQL>二元组&#xff0c;涉及280个不同领域的数据库。CoSQL&#xff1a;一个用于构建跨域对话文本到sql系统的语料库。它是Spider和SPar…

设备巡检系统小程序ThinkPHP+UniApp

基于ThinkPHP和Uniapp开发的设备巡检系统&#xff0c;可应用于电力、水利、物业等巡检场景&#xff0c;可编译微信小程序。提供全部无加密源码&#xff0c;可私有化部署。 ​功能特性 部门管理 后台可以设置多部门&#xff0c;便于筛选员工 员工管理 后台维护员工信…

Visual Studio Code 1.101下载

[软件名称]: Visual Studio Code 1.101 [软件大小]: 147 MB [下载通道]: 夸克盘 | 迅雷盘 | 百度盘 &#x1f3af; 一、MCP&#xff08;Model Context Protocol&#xff09;全面升级 资源 Templates 支持 MCP 现在不仅能处理提示&#xff0c;还能识别和管理“资源模板”&…

linux的基本运维

grep 选项功能-r递归搜索子目录-i忽略大小写-n显示行号-l只显示文件名-v反转匹配&#xff08;显示不包含的行&#xff09;-w全词匹配-E使用扩展正则表达式–include指定文件类型 --include*.{js,py}–exclude排除文件类型 --exclude*.log–exclude-dir排除目录 --exclude-dir{…

c++11右值引用(rvalue reference)

右值引用&#xff08;rvalue reference&#xff09;是 C11 引入的一个新特性&#xff0c;主要用于支持移动语义&#xff0c;优化资源的管理&#xff0c;尤其是在进行资源转移时避免不必要的拷贝操作。右值引用通过 && 符号进行表示。 1. 右值引用的基本概念 右值&…

【算力网络】算网安全

一、算网安全概念 算力网络与网络空间安全的结合设计需构建“内生安全、智能调度、动态防护”的一体化体系&#xff0c;而SRv6安全服务链正是实现该目标的核心技术路径。 1.1、算力网络安全架构设计 1.1.1 体系化架构思路与方法体系 1. ​分层安全架构&#xff08;“三横一…

传输层协议UDP/TCP

目录 UDP协议 UDP协议段格式 UDP缓冲区 TCP协议 TCP协议段格式 确认应答机制 超时重传机制 连接管理机制 连接建立&#xff08;三次握手&#xff09; 连接关闭&#xff08;四次挥手&#xff09; 滑动窗口 流量控制 拥塞控制 延迟应答 捎带应答 UDP协议 UDP协议…

华为OD-2024年E卷-找终点[100分] -- python

问题描述&#xff1a; 给定一个正整数数组&#xff0c;设为nums&#xff0c;最大为100个成员&#xff0c;求从第一个成员开始&#xff0c;正好走到数组最后一个成员&#xff0c;所使用的最少步骤数。要求: 第一步必须从第一元素开始&#xff0c;且1<第一步的步长<len/2…

ARINC653分区调度算法的研究与改进

# ARINC653分区调度算法的研究与优化&#xff1a;从单核到多核的实时性保障 ## 1 研究背景与意义 航空电子系统经历了从**联合式架构**到**综合模块化航空电子**&#xff08;Integrated Modular Avionics, IMA&#xff09;架构的重大演变。在这一演变过程中&#xff0c;ARINC…

Vue-8-前端框架Vue之应用基础响应式数据和计算属性

文章目录 1 响应式数据1.1 ref创建基本类型的响应式数据1.2 reactive创建对象类型的响应式数据1.2.1 汽车示例(对象{})1.2.2 游戏示例(数组[])1.2.3 深层示例1.3 ref创建对象类型的响应式数据1.4 ref对比reactive1.4.1 区别和使用原则1.4.2 reactive重新分配新对象1.4.3 ref重新…

Kotlin - 边界控制 coerceIn、coerceAtLeast、coerceAtMost

一、概念 当需要对数值进行范围限制时&#xff0c;通常会用 if() else if() else&#xff0c;这样会写很多判断&#xff0c;使用 coerceXXX() 函数来简化&#xff0c;适用于实现了 Comparable 接口的对象。 coerceIn() public fun <T : Comparable<T>> T.coerceIn(…

Day02_数据结构(手写)

01.画图 02.按位置查找返回元素的值 //11.按位置查找后返回元素的值 int find_pos(node_p H,int pos) { if(HNULL){return -1;} if(pos<0){ …

1.2 人工智能的分类

人工智能的类型 ANI 无需明确设计即可构建或训练&#xff0c;以执行特定任务或解决特定问题的智能系统。也被称为弱人工智能&#xff0c;因为它不具备全面的通用智能能力。 典型应用&#xff1a; 语音助手&#xff0c;图像识别系统、自动驾驶、机器人等。 大语言模型ChatGPT …

热点Key拆分方案实现

热点Key拆分方案实现 一、核心拆分策略 热点Key拆分的核心思想是将单个高频访问Key分解为多个子Key&#xff0c;分散存储到不同Redis节点&#xff0c;降低单节点压力。以下是具体实现方案&#xff1a; 二、实现方式 1. 业务层哈希分片实现 创建Key分片工具类&#xff0c;通…