C# 和 .NET Core 设计模式实用指南(四)
原文:
zh.annas-archive.org/md5/49ca655f3c4c7af7e500ba77019890ca译者:飞龙
第十四章:评估
第一章 – .NET Core 和 C#中面向对象编程概述
- 晚期和早期绑定这两个术语指的是什么?
在源代码编译时建立早期绑定,而在组件运行时建立晚期绑定。
- C#支持多重继承吗?
不。理由是多重继承会导致源代码更加复杂。
- 在 C#中,可以使用什么级别的封装来防止从库外部访问类?
internal 访问修饰符可以用来限制类只对库内部可见。
- 聚合和组合有什么区别?
这两种都是关联类型,区分这两种类型的最简单方法是看涉及的类是否可以在不关联的情况下存在。在组合关联中,涉及的类具有紧密的生命周期依赖性。这意味着,当一个类被删除时,相关的类也会被删除。
- 接口可以包含属性吗?(这是一个有点棘手的问题)
接口可以定义属性,但作为一个接口,它确实有一个主体…
- 狗吃鱼吗?
狗很可爱,但它们会吃掉它们嘴里能吃到的大部分东西。
第二章 – 现代软件开发模式和原则
- 在 SOLID 原则中,S 代表什么?责任是什么意思?
单一职责原则。责任可以被视为改变的理由。
- 围绕周期构建的 SDLC 方法:瀑布还是敏捷?
敏捷开发是基于开发过程以一系列周期进行的这一概念构建的。
- 装饰者模式是创建型模式还是结构型模式?
装饰者模式是一种结构模式,它允许将功能在类之间划分,并且特别适用于在运行时增强类。
- pub-sub 集成代表什么?
发布-订阅是一种有用的模式,其中进程发布消息,其他进程订阅以接收这些消息。
第三章 – 实现设计模式 – 基础部分 1
- 在为组织开发软件时,为什么有时很难确定需求?
为一个组织开发软件有许多挑战。一个例子是组织行业的变化可能导致当前需求需要改变。
- 瀑布软件开发与敏捷软件开发相比,有哪些优点和缺点?
水晶瀑布软件开发相对于敏捷软件开发具有优势,因为它更容易理解和实施。在某些情况下,如果项目的复杂性和规模较小,瀑布软件开发可能比敏捷软件开发更好。然而,瀑布软件开发处理变更的能力较差,并且由于范围较大,在项目完成之前,需求变更的可能性也更大。
- 依赖注入在编写单元测试时是如何帮助的?
通过将依赖项注入到类中,类变得更容易测试,因为依赖项是明确且易于访问的。
- 为什么以下陈述是错误的?使用 TDD 后,你不再需要人们测试新的软件部署。
测试驱动开发通过将清晰的测试策略构建到软件开发生命周期中,有助于提高解决方案的质量。然而,定义的测试可能并不完整,因此仍然需要额外的资源来验证交付的软件。
第四章 – 实现设计模式 – 基础部分 2
- 提供一个示例来展示为什么使用单例不是限制对共享资源访问的好机制?
单例模式故意在应用程序中创建瓶颈。它也是开发者最初学习的第一个模式之一,因此,它通常用于不需要限制对共享资源访问的情况。
- 以下陈述是否正确?为什么或为什么不正确?
ConcurrentDictionary防止集合中的项目被一次更新多个线程。
对于许多 C#开发者来说,意识到ConcurrentDictionary不能防止一次更新多个线程是痛苦的一课。ConcurrentDictionary保护共享字典免受并发访问和修改。
- 什么是竞态条件以及为什么应该避免它?
竞态条件是指多个线程处理顺序的不同可能导致不同的结果。
- 工厂模式是如何帮助简化代码的?
工厂模式是解耦应用程序内对象创建的有效方式。
- .NET Core 应用程序需要第三方 IoC 容器吗?
.NET Core 内置了强大的控制反转。当需要时,它可以由其他 IoC 容器增强,但不是必需的。
第五章 – 实现设计模式 – .NET Core
- 如果你不确定要使用哪种服务生命周期,最好将类注册为哪种类型?为什么?
临时生命周期服务每次请求时都会创建。大多数类应该是轻量级、无状态的服务,因此这是最佳的服务生命周期。
- 在.NET Core ASP .NET 解决方案中,范围是针对每个 Web 请求还是每个会话定义的?
范围是针对每个 Web 请求(连接)的。
- 在.NET Core DI 框架中将类注册为 Singleton 会使它线程安全吗?
不,框架将为后续请求提供相同的实例,但不会使类成为线程安全的。
- .NET Core DI 框架是否只能用其他 Microsoft 提供的 DI 框架替换?
是的,有许多可以替代原生 DI 框架的 DI 框架。
第六章 – 实现 Web 应用程序的设计模式 – 第一部分
- 什么是 Web 应用程序?
这是一个使用 Web 浏览器并可以在公共网络上可用的情况下从任何地方访问的程序。它基于客户端/服务器架构,通过接收 HTTP 请求并提供 HTTP 响应来服务客户端。
- 制作一个你选择的 Web 应用程序,并描绘 Web 应用程序的工作图景。
参考 FlixOne 应用程序。
- 什么是控制反转?
控制反转(IoC)是一个用于反转或委派控制的容器。它基于 DI 框架。.NET Core 内置了一个 IoC 容器。
- 什么是 UI/架构模式?你希望使用哪种模式以及为什么?
UI 架构模式旨在设计一个健壮的用户界面,以提供更好的应用程序用户体验。从开发者的角度来看,MVC、MVP 和 MVVM 是流行的模式。
第七章 - 实现 Web 应用程序的设计模式 - 第二部分
- 什么是身份验证和授权?
身份验证是一个系统通过凭证(通常是一个用户 ID 和密码)验证或识别传入请求的过程。如果系统发现提供的凭证是错误的,那么它会通知用户(通常通过 GUI 屏幕上的消息),并终止授权过程。
授权总是在身份验证之后。这是一个允许经过验证的用户在验证他们有权访问特定资源或数据后访问资源或数据的过程。
- 在请求的第一级使用身份验证然后允许对受限区域的请求是否安全?
这并不总是安全的。作为开发者,我们应该采取所有必要的步骤来使我们的应用程序更加安全。在一级请求之后,身份验证之后,系统还应检查资源级别的权限。
- 你将如何证明授权总是在身份验证之后?
在一个简单的 Web 应用程序场景中,它首先通过要求登录凭证来验证用户,然后根据角色授权用户访问特定资源。
- 什么是测试驱动开发以及为什么开发者关心它?
测试驱动开发是一种确保代码被测试的方法;它就像通过编写代码来测试代码。TDD 也被称为红/蓝/绿概念。开发者应该遵循它来确保他们的代码/程序在没有错误的情况下工作。
- 定义 TDD Katas。它是如何帮助我们改进我们的 TDD 方法的?
TDD Katas 是帮助通过实践学习编码的小场景或问题。你可以以 Fizz Buzz Katas 为例,开发者应该应用编码来学习和实践 TDD。如果你想练习 TDD Katas,请参考这个仓库:github.com/garora/TDD-Katas.
第八章 - .NET Core 中的并发编程
- 什么是并发编程?
当事物/任务同时发生时,我们说任务是在并发发生的。在我们的编程语言中,当我们的程序的任何部分同时运行时,这就是并发编程。
- 真正的并行性是如何发生的?
在单 CPU 机器上不可能实现真正的并行性,因为任务是不可切换的,因为它有一个单核。这只有在具有多个 CPU(多个核心)的机器上才会发生。
- 什么是竞争条件?
多个线程可能访问同一共享数据并更新它,导致不可预测的结果,这种情况可以称为竞争条件。
- 为什么我们应该使用
ConcurrentDictionary?
并发字典是一个线程安全的集合类,存储键值对。这个类有锁语句的实现,并提供了一个线程安全的类。
第九章 – 函数式编程实践 – 一种方法
- 什么是函数式编程?
函数式编程是一种符号计算的方法,就像我们解决数学问题一样。任何函数式编程都基于数学函数。任何函数式编程风格的语言都是通过两个术语来工作的:要解决的问题和如何解决问题?
- 函数式编程中的引用透明性是什么?
在函数式程序中,一旦我们定义了变量,它们在整个程序中不会改变它们的值。由于函数式程序没有赋值语句,如果我们需要存储值,就没有替代方案;相反,我们定义新的变量。
- 什么是
Pure函数?
Pure 函数通过声明它们是纯的来加强函数式编程。这些函数满足两个条件:
-
-
对于提供的参数,最终结果/输出始终是相同的。
-
这些不会影响程序的行为或应用的执行路径,即使它们被调用了一百次。
-
第十章 – 反应式编程模式和技巧
- 什么是流?
事件序列被称为流。一个流可以发出三个东西:一个值、一个错误和一个完成信号。
- 什么是反应式属性?
反应式属性是当事件触发时做出反应的绑定属性。
- 什么是反应式系统?
基于反应式宣言,我们可以得出结论,反应式系统如下:
-
-
响应性:由于这种设计方法,反应式系统是事件驱动的设计系统;这些系统能够快速响应任何请求。
-
可扩展性:反应式系统在本质上具有反应性。这些系统可以通过扩展或减少分配的资源来改变可扩展性速率。
-
弹性:一个弹性的系统是指即使在出现任何故障/异常的情况下也不会停止的系统。反应式系统被设计成这样,即尽管有任何异常或故障,系统也不会死亡;它仍然在运行。
-
基于消息的:任何项目的数据都代表一个消息,并且可以被发送到特定的目的地。当一个消息或数据到达给定的状态时,一个作为信号的事件被发出以通知消息已被接收。响应式系统依赖于这种消息传递。
-
- 合并两个响应式流是什么意思?
合并两个响应式流实际上是将两个相似或不同的响应式流的元素组合成一个新的响应式流。例如,如果你有stream1和stream2,那么stream3 = stream1.merge(stream2),但stream3的序列将不会有序。
- 什么是 MVVM 模式?
模型-视图-视图模型(MVVM)是模型-视图-控制器(MVC)的变体之一,以满足现代 UI 开发方法,其中 UI 开发是设计师/UI 开发者的核心责任,而不是应用程序开发者的责任。在这种开发方法中,一个更多的是图形爱好者并且专注于使用户界面更吸引人的设计师可能或可能不会关心应用程序的开发部分。通常,设计师(UI 人员)使用各种工具来使用户界面更吸引人。MVVM 被定义为如下:
-
-
模型:这也被称为领域对象,它只持有数据;没有业务逻辑、验证等。
-
视图:这是为最终用户表示数据的方式。
-
视图模型:它将视图和模型分开;其主要责任是更好地服务最终用户。
-
第十一章 - 高级数据库设计和应用技术
- 什么是账本式数据库?
这个数据库旨在仅进行插入操作;没有更新。然后,你创建一个视图来聚合这些插入操作。
- CQRS 是什么?
命令查询责任分离(Command Query Responsibility Segregation)是一种模式,它将查询(用于插入)和命令(用于更新)之间的责任进行分离。
- 何时应该使用 CQRS?
CQRS 可以是一个适用于基于任务或事件驱动系统的良好模式,特别是当解决方案由多个应用程序组成而不是一个单一的单体网站或应用程序时。它是一个模式而不是架构,因此应该根据具体情况应用,而不是在所有业务场景中应用。
第十二章 - 云端编码
- 这是一个正确的陈述吗?大多数模式都是最近开发的,并且仅适用于基于云的应用程序。
不,这不是真的。随着软件开发的变化,模式一直在演变,但许多核心模式已经存在了几十年。
- ESB 代表什么?它可以用在哪种架构中:事件驱动架构(EDA)、面向服务的架构(SOA)还是单体架构?
它代表企业服务总线。它可以在事件驱动架构和面向服务的架构中有效地使用。
- 基于队列的负载均衡主要用于 DevOps、可扩展性还是可用性?
可用性。基于队列的负载均衡主要用于通过充当缓冲区来处理负载的大幅波动,以减少应用程序不可用的可能性。
- CI/CD 的好处是什么?它对大量全球分散的团队或单个小型本地化开发团队更有益吗?
通常,CI/CD 通过频繁执行合并和部署来帮助在开发生命周期的早期识别问题。较大的、更复杂的解决方案往往比较小的、更简单的解决方案显示出更多的优势。
- 在遵循静态内容托管的网站上,浏览器是否直接通过 CDN 检索图像和静态内容,还是 Web 应用程序代表浏览器检索信息?
内容分发网络可以通过在多个数据中心缓存静态资源来提高性能和可用性,允许浏览器直接从最近的数据中心检索内容。
附录 A – 其他最佳实践
- 什么是实践?请从我们的日常/日常生活中举几个例子。
实践可能是一到多个常规活动。为了学习驾驶,我们应该练习驾驶。实践是一种不需要记忆的活动。我们的日常生活中有很多实践例子:边看电视节目边吃饭,等等。在你观看你最喜欢的电视节目时吃任何东西都不会打破你的节奏。
- 我们可以通过练习获得特定的编码技能。请解释这一点。
是的,我们可以通过练习获得特定的编码技能。这种练习需要关注和一致性。例如,你想学习测试驱动开发。为此,你需要先学习它。你可以通过练习 TDD-Katas 来学习。
- 什么是测试驱动开发以及它如何帮助开发者进行实践?
测试驱动开发是一种确保代码被测试的方法;它就像我们通过编写代码来测试代码一样。TDD 也被称为红/蓝/绿概念。开发者应该遵循它,以确保他们的代码/程序在没有错误的情况下工作。
更多推荐
所有评论(0)