- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们正在讨论为实体类定义方法的最佳方式 - 作为扩展方法或使用分部类。我们讨论的这类方法不会修改实体的状态,它们是纯粹的“辅助”方法,可以查询状态并返回值。
这两种方法的主要好处是保持实体类干净,同时仍然为客户端代码提供智能感知支持。
我对这两种方式都没有强烈的偏好,但很想知道其他人是否对其中一种有偏好(或知道记录的指南)。
我开始为我能想到的每种方法写下优点列表,但最后我想到的是:
部分类
方法定义位于类中(即使它是另一个文件),因此支持“查找方法”的 Visual Studio 工具(例如 resharper 中的 ALT-\)将定位该方法
由于使用了 partial 关键字,一旦实体类被打开,包含辅助方法的其他文件的存在就很明显
扩展方法
其他人可以对此发表意见吗?
PS 我不认为这是以下问题的重复,因为该问题的提问者满足于将概述功能差异的回复标记为正确答案,但未回答有关哪种方法的问题是这种情况下的最佳做法: Partial Class vs Extension Method
编辑 - 我正在寻找人们对一种方法或另一种方法的偏好,因为我们找不到针对这种特定情况的文档化指南。这两种方法都是可能的,并且都不违反任何设计原则,所以这是一个偏好问题,我想知道你的。
最佳答案
在我看来,扩展方法有两个好处。首先,当你将它们应用到接口(interface)上时,会给你一种写抽象基类的错觉,让你定义一些常用的方法,但它更灵活,因为一个类只能有一个基类,但可以实现多个接口(interface)。其次,如果你将它应用到常规类(class)中,那么我倾向于将其视为某种黑客攻击。当原始类缺少一些方法时,你真的觉得他们应该有这些方法,但他们没有,而且你也够不到,所以你不得不在其他地方实现它们,作为实用方法,它给出了你错觉它真的在那里。
这两种情况最终都只是语法糖,但扩展接口(interface)对我来说更有意义,例如,如果我只看 LINQ 的 Enumerable 类。我已经在几十个完全不同的类上使用了这些扩展方法,所以它确实得到了返回。类扩展方法的一个示例是在将其添加到框架之前创建自己的 string.IsNullOrWhitespace。
扩展接口(interface)似乎是正确的,因为接口(interface)定义了一个契约,你可以在你的扩展方法中依赖那个契约,但是当你扩展一个常规类时,它可能会改变并破坏你的扩展方法。当然,界面也可能会发生变化,但我认为它们往往设计得更彻底,但我没有任何统计数据。
然后是面向对象编程的情况。你觉得你的方法应该去哪里,谁使用这些额外的方法,边界在哪里。如果你认为一个方法属于一个类,那么就把它放在类中。有道理,很简单。在发明扩展方法之前,人们编写了非常好的类,他们把一切都放在了它所属的地方,生活很美好,哈哈。
部分类很酷,因为它们不像扩展方法那么复杂。它们不是语法糖,也不是魔法。这只是处理自动生成类的最好和最简单的方法,所以我没有想太多。我已经编写了一些代码生成器,它们会发出人类可以编写自己的东西的区域,并且不会在后续代码生成中被覆盖。那样比较舒服,但仅此而已。我无法更改 .NET 工具生成代码的方式,它们也不会这样做,因此分部类是下一个最好的选择。
总而言之,我的观点是只在真正需要时才使用扩展方法,并尽可能使用分部类。
关于c# - 指南 - 扩展方法与部分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20279424/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!