📝 配套习题(40 题)
💡 参考答案在文末
单选题
1
在Python开发中,使用IDE重构工具进行重命名操作相比手动修改,最重要的优势是?
A
使用熔断器(Circuit Breaker)防止故障蔓延
3
DDD中仓储(Repository)的主要职责是什么?
B
可以使用Mock对象替换真实依赖,实现测试隔离
5
在API设计中,关于认证与授权的安全最佳实践,以下哪项说法是最重要且必须遵守的?
A
使用Basic Auth将用户名密码放在请求头中
B
JWT Token应该设置合理的过期时间,并使用强密钥签名
C
API Key应该硬编码在客户端代码中便于调用
D
敏感API不需要任何认证,只需验证请求来源IP
6
观察者模式中,主题(Subject)通知观察者(Observer)时,以下哪种方式是最推荐的?
A
直接调用观察者的具体方法名,如observer.log_event()
B
调用观察者的统一接口方法,如observer.on_event(event)
7
里氏替换原则(LSP)要求子类能够完全替换父类使用。以下哪种情况违反了里氏替换原则?
C
子类重写父类方法时抛出了父类方法不会抛出的异常
多选题
9
在Python中实现经典设计模式时,以下哪些实现方式是正确且推荐的?
A
单例模式:使用__new__方法控制实例创建,确保只有一个实例
B
单例模式:使用模块级别的变量实现单例,Python模块天然单例
C
工厂模式:使用工厂类创建对象,隐藏具体创建逻辑
D
工厂模式:使用__init_subclass__实现自动注册工厂
E
策略模式:使用函数而非类实现策略,利用Python函数是一等对象
G
观察者模式:使用列表管理观察者,通过循环调用通知方法
B
限界上下文(Bounded Context):明确的业务边界和模型边界
C
聚合(Aggregate):一组相关对象的集合,作为数据修改的单元
D
实体(Entity):有唯一标识的对象,身份不变属性可变
E
值对象(Value Object):没有唯一标识,通过属性值定义的对象
F
领域服务(Domain Service):不属于任何实体或值对象的领域操作
G
应用服务(Application Service):协调领域对象完成业务用例
H
仓储(Repository):管理聚合的持久化和检索
11
从单体架构演进到微服务架构时,以下哪些策略是推荐的最佳实践?
C
先建立微服务基础设施(服务发现、配置中心、消息队列)
F
使用绞杀者模式(Strangler Pattern)逐步替换功能
12
确定微服务的拆分粒度和边界时,以下哪些原则是应该遵循的?
13
微服务架构演进中的数据迁移和一致性保障,以下哪些策略是正确的?
A
URL路径版本化简单直观,便于客户端理解和使用
B
请求头版本化更符合REST原则,URL保持简洁
C
版本升级时应该立即废弃旧版本,强制所有客户端迁移
F
向后兼容的改动(如添加可选字段)不需要升级版本号
15
以下哪些是常见的代码异味(Code Smells),提示需要重构?
A
重复代码(Duplicated Code):相同代码出现在多处
B
过长方法(Long Method):方法超过10行就需要重构
C
过大类(Large Class):类承担太多职责
D
过长参数列表(Long Parameter List):方法参数过多
E
发散式变化(Divergent Change):一个类因多种原因被修改
F
霰弹式修改(Shotgun Surgery):一个改动需要修改多个类
G
依恋情结(Feature Envy):方法过多使用其他类数据
H
数据泥团(Data Clumps):多个数据总是一起出现
16
SOLID原则是面向对象设计的五大原则,以下哪些Python代码示例正确应用了对应的SOLID原则?
D
接口隔离原则(ISP):使用多个专门接口而非通用接口
E
依赖倒置原则(DIP):高层模块依赖抽象而非具体实现
17
以下哪些场景体现了对单一职责原则(SRP)的正确应用?
A
将用户管理类拆分为用户信息类、用户持久化类、用户验证类
B
将日志记录功能从业务类中提取为独立的日志服务类
F
一个服务类同时处理API请求、数据验证、数据库操作
18
在Python中实现开闭原则(OCP)时,以下哪些方式是正确的?
B
使用装饰器模式,在不修改原类的情况下添加新功能
F
为避免跨服务查询,可以在一个服务中复制其他服务数据
A
提取方法(Extract Method):将一段代码提取为独立方法
B
内联方法(Inline Method):将方法调用替换为方法体内容
C
提取变量(Extract Variable):将复杂表达式结果存入临时变量
D
提升方法(Pull Up Method):将子类方法移动到父类
E
降低方法(Push Down Method):将父类方法移动到子类
F
重命名方法(Rename Method):使方法名更清晰表达意图
G
封装字段(Encapsulate Field):将公开字段改为私有并添加getter/setter
H
删除重复代码(Remove Duplicate Code):直接删除所有相似代码
21
设计RESTful API时,以下哪些原则是应该遵守的最佳实践?
A
使用HTTP方法语义:GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源
B
URL中包含操作动词,如 /api/getUser、/api/deleteOrder
C
使用复数名词表示资源集合,如 /users、/orders
D
在URL中传递敏感参数,如 /api/users?password=xxx
E
使用HTTP状态码表示响应结果,如200表示成功,404表示资源不存在
F
所有API都返回200状态码,在响应体中用自定义字段表示错误
G
API版本号放在URL路径中,如 /api/v1/users
H
API版本号放在请求头中,如 Accept: application/vnd.api+json;version=1
22
关于Python中的单例模式实现,以下哪些说法是正确的?
E
元类(metaclass)可以用来实现单例模式
F
使用类属性存储实例,配合__new__实现单例
G
Python的模块天然是单例,导入多次返回同一模块对象
A
需要根据配置动态创建不同类型的对象时使用工厂模式
B
对象创建逻辑复杂,需要隐藏创建细节时使用工厂模式
D
一个操作有多种实现方式,需要灵活选择时使用策略模式
F
需要将算法的使用者和算法实现解耦时使用策略模式
G
简单的对象创建直接调用构造函数,不需要工厂模式
A
同步通信(REST/gRPC)适合需要实时响应的场景
C
REST API简单易用,适合公开API和跨语言调用
A
重构应该在添加新功能之前进行,使代码结构更清晰
B
重构应该在修复Bug时进行,使代码更容易定位问题
G
重构时机包括:代码难以理解、重复代码过多、方法过长
H
重构应该遵循"小步前进"原则,每次只做一个小改动
26
关于依赖注入模式(DI)的核心原理和实现,以下哪些说法是正确的?
A
依赖注入将对象的创建和绑定责任从类本身移交给外部
B
依赖注入提高了代码的可测试性,便于使用Mock对象进行测试
D
Setter方法注入适用于可选依赖或需要运行时更换的场景
H
使用依赖注入后,类不再依赖具体的实现类,只依赖抽象
27
依赖注入有三种主要方式:构造函数注入、Setter方法注入、接口注入。以下哪些说法是正确的?
B
Setter方法注入适合可选依赖,可以在运行时更换
E
Setter方法注入可能导致对象处于不完整状态
F
所有依赖都应该使用构造函数注入,Setter注入不推荐
H
混合使用多种注入方式可以根据依赖特性选择最佳方式
28
依赖注入容器(DI Container)提供了哪些核心功能?
B
管理对象的生命周期(Singleton、Scoped、Transient)
29
使用Python构建微服务架构时,以下哪些组件和设计是推荐的?
A
使用FastAPI或Flask构建轻量级REST API服务
C
使用消息队列(如RabbitMQ、Kafka)实现异步通信
D
使用服务发现机制(如Consul、Nacos)动态发现服务
G
使用分布式追踪系统(如Jaeger、Zipkin)监控调用链
H
使用熔断器(如Circuit Breaker)防止故障蔓延
30
设计RESTful API时,以下HTTP状态码使用场景匹配正确的是?
C
客户端请求参数错误返回400 Bad Request
D
客户端未提供认证信息返回401 Unauthorized
E
客户端已认证但无权限访问返回403 Forbidden
F
请求的资源不存在返回500 Internal Server Error
G
客户端请求条件不满足返回409 Conflict
H
请求超时返回408 Request Timeout
31
关于实体(Entity)和值对象(Value Object)的区别,以下哪些说法是正确的?
C
实体通过标识判断相等,值对象通过所有属性判断相等
32
关于DDD中的聚合(Aggregate)设计,以下哪些原则是应该遵守的?
A
聚合根是聚合的唯一入口,外部只能通过聚合根访问聚合内对象
C
聰合之间通过ID引用,不直接持有对方的对象引用
D
聚合保证内部一致性,边界内的事务完整性由聚合根负责
填空题
33
代码重构的标准流程:首先确保代码有足够的____________覆盖,建立重构的安全保障。然后识别____________,确定需要重构的位置。接着采用____________前进策略,每次只做一个小的改动。每次改动后立即____________确认功能不变。完成一个完整重构序列后及时____________,保持版本历史清晰。重构完成后进行____________,确保重构质量。
34
DDD中服务分为两类:____________是领域逻辑的一部分,不属于任何实体或值对象,负责领域内的操作。____________是应用层的协调者,负责协调领域对象完成业务用例,不包含业务逻辑。领域服务位于____________,应用服务位于____________。领域服务命名通常使用____________,如TransferService、ExchangeService。应用服务负责____________和____________,调用领域对象执行业务逻辑后返回____________给前端。
35
OpenAPI规范(原Swagger)是API文档的行业标准。在OpenAPI 3.0中,API基本信息定义在____________对象中。API服务器地址定义在____________数组中。API端点定义在____________对象中,每个路径下按HTTP方法组织。请求参数分为三类:路径参数使用path类型,查询参数使用query类型,请求体使用requestBody对象定义。响应定义使用responses对象,键为状态码。
36
在Python中实现依赖注入,常用库包括____________、____________和____________。使用装饰器____________标记需要注入的方法或构造函数。容器使用____________方法配置抽象到具体实现的绑定。生命周期使用____________装饰器标记单例。使用____________方法从容器获取已配置依赖的实例。Python的鸭子类型特性使得依赖注入可以不使用抽象基类,只要对象实现相同的____________即可注入。
37
装饰器模式在Python中有两种实现方式:传统的类装饰器和Python特有的____________。类装饰器继承被装饰类,通过____________()调用父类方法并添加新功能。函数装饰器使用@____________保留原函数的元信息。装饰器可以叠加使用,执行顺序是从____________到____________。类装饰器使用________________方法使装饰后的类可调用。Python内置的@property、@____________、@staticmethod都是装饰器模式的应用。
38
依赖倒置原则的核心概念:高层模块不应该依赖低层模块,两者都应该依赖____________。抽象不应该依赖细节,细节应该依赖____________。在Python中,使用____________模块定义抽象基类,使用____________装饰器标记抽象方法。依赖注入是实现依赖倒置的重要手段,通过____________或____________注入依赖对象。使用依赖注入后,高层模块只需要知道____________类型,具体实现由外部提供。
39
Python微服务的部署策略:使用____________容器打包服务,实现环境一致性。使用____________编排容器,实现自动调度和扩展。使用____________流水线自动化构建、测试、部署流程。健康检查使用____________端点返回服务状态。配置管理使用____________和____________存储配置和敏感信息。日志收集使用____________栈(Elasticsearch、Logstash、Kibana)。监控使用____________收集指标,____________可视化展示。
40
微服务架构的核心组件:____________负责统一入口、路由分发和跨域处理。____________机制让服务动态注册和发现其他服务地址。____________集中管理各服务的配置信息。____________实现服务间异步通信和事件驱动。____________系统监控服务调用链路,便于问题定位。____________机制防止服务故障蔓延,保障系统稳定性。
参考答案
1.B
2.A
3.B
4.B
5.B
6.B
7.C
8.A
9.A;B;C;D;E;F;G
10.A;B;C;D;E;F;G;H
11.B;C;D;F;H
12.A;C;D;F;G;H
13.A;B;D;E;G;H
14.A;B;D;E;F
15.A;C;D;E;F;G;H
16.A;B;C;D;E
17.A;B;D;E;G
18.A;B;E;F;H
19.A;B;C;D;F;G;H
20.A;B;C;D;E;F;G
21.A;C;E;G;H
22.A;B;C;E;F;G;H
23.A;B;C;D;E;F;G;H
24.A;B;C;D;E;F;H
25.A;B;D;F;G;H
26.A;B;C;D;E;F;H
27.A;B;C;D;E;H
28.A;B;C;D;E;G;H
29.A;B;C;D;E;F;G;H
30.A;B;C;D;E;G;H
31.A;B;C;D;E;F;G
32.A;B;C;D;E;H
33.测试;代码异味;小步;运行测试;提交代码;代码审查
34.领域服务;应用服务;领域层;应用层;动词;事务管理;权限检查;DTO
35.info;servers;paths
36.injector;dependency_injector;pydantic;@inject;bind;singleton;get;方法
37.函数装饰器;super;wraps;内;外;call;classmethod
38.抽象;抽象;ABC;abstractmethod;构造函数;setter方法;接口
39.Docker;Kubernetes;CI/CD;/health;ConfigMap;Secret;ELK;Prometheus;Grafana
40.API网关;服务发现;配置中心;消息队列;分布式追踪;熔断降级
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码