Questions tagged «methods»


7
为什么要使用私有静态方法?
我只是想解决一个问题。与具有私有可见性的普通方法相比,拥有私有静态方法有什么意义? 我本来以为拥有静态方法的一个优点是可以在没有类实例的情况下调用它,但是由于它的私有性,甚至有一点是静态的吗? 我能想到的唯一原因是,它有助于从概念上理解类级别(而不是对象级别)上的方法。

18
长方法总是不好的吗?[关闭]
因此,环顾四周,我注意到一些关于长方法是不好的做法的评论。 我不确定我是否总是同意长方法是不好的(并希望别人提出意见)。 例如,我有一些Django视图,在将对象发送到视图之前会对其进行一些处理,一个长方法是350行代码。我编写了代码,以便处理参数-对查询集进行排序/过滤,然后对查询返回的对象进行一点点处理。 因此,处理主要是条件聚合,它具有足够复杂的规则,无法在数据库中轻松完成,因此我在主循环外部声明了一些变量,然后在循环期间对其进行了更改。 variable_1 = 0 variable_2 = 0 for object in queryset : if object.condition_condition_a and variable_2 > 0 : variable 1+= 1 ..... ... . more conditions to alter the variables return queryset, and context 因此,根据理论,我应该将所有代码分解为较小的方法,以使视图方法的最大长度为一页。 但是,过去曾经在各种代码基础上工作过,当您需要不断地从一种方法跳转到另一种方法来查明代码的所有部分,同时又将最外层的方法放在脑海中时,有时会发现它使代码的可读性降低。 我发现拥有一个格式合理的长方法,您可以更轻松地看到逻辑,因为它不会被内部方法隐藏。 我可以将代码分解为较小的方法,但是通常会有一个内部循环用于两三件事,因此这会导致代码更复杂,或者方法只会做两三件事而不做一件事(或者我可以为每个任务重复内部循环,但是这样会影响性能。 那么是否存在长方法并不总是不好的情况?当只在一个地方使用这些方法时,总会有一种情况吗? 更新:好像一年多以前我问了这个问题。 因此,在这里(混合)响应之后,我重构了代码,将其拆分为方法。这是一个Django应用,可从数据库中检索复杂的相关对象集,因此测试参数不可用(可能一年中的大部分时间都需要为测试用例创建相关对象。我有一个“昨天需要做的事情”类型)工作环境,然后再抱怨)。现在,修复该代码部分中的错误现在稍微容易一些,但并不是那么容易。 之前: #comment 1 bit of …

6
函数和lambda有什么区别?
我对“功能”和“ lambda”有些困惑。我看过一些例子,它们表明scheme关键字的lambda工作方式与JavaScript关键字非常相似function,但是我真的不知道它们之间的关系。 有人告诉我说.net中的对象时,“功能”和“方法”可以互换使用。我想知道“ lambda”和“ function”是否同样含义相同。看到希腊字母lambda(λ)出现在此站点上的许多化身中,我不知道'lambda'是否具有某些深奥的含义。更让人困惑的是,在.net中,C#的功能部分将传递给另一个函数的函数表达式称为“ lambda表达式”,因此,这个词似乎无处不在。 我对“ lambda演算”一词也很熟悉。 函数和lambda有什么区别?

9
如何以及为什么在带有“ get”和“ find”前缀的命名方法之间做出决定
我总是很难确定是否应该以getSomethingvs 开头的某个方法findSomething。 问题在于为设计不当的API 创建帮助程序。当从对象获取数据时通常会发生这种情况,这需要对象作为参数。这是一个简单的示例: public String getRevision(Item item) { service.load(item, "revision"); // there is usually more work to do before getting the data.. try { return item.get_revision(); } catch(NotLoadedException exception) { log.error("Property named 'property_name' was not loaded", exception); } return null; } 如何以及为什么要在将此方法命名为getRevision()or时做出决定findRevision()?
47 naming  methods 

7
使用仅使用大小写与类型名称不同的参数名称是否被认为是C#中的不良做法?
对于与类的属性匹配的参数名称,我看到与此类似的问题,但是除了使用C#中的大小写外,对于使用与参数类型名称相同的参数名称,我找不到任何东西。我发现这似乎不是违规行为,但是否认为这是不正确的做法?例如,我有以下方法 public Range PadRange(Range range) {} 此方法采用一个范围,并返回已应用填充的新范围。因此,鉴于通用上下文,我无法想到该参数的更具描述性的名称。但是,我想起了我在阅读《代码完整》中有关“心理距离”的一些提示。它说 心理距离可以定义为区分两个项目的难易程度...调试时,请准备好应对类似变量名之间以及相似例程名之间的心理距离不足所引起的问题。在构造代码时,请选择差异较大的名称,以便可以避免此问题。 我的方法签名有很多“范围”,因此,就心理距离而言,这可能是一个问题。现在,我看到许多开发人员都在执行以下操作 public Range PadRange(Range myRange) {} 我个人对此公约非常反对。向变量名添加“ my”前缀不会提供任何其他上下文。 我也看到以下 public Range PadRange(Range rangeToPad) {} 我喜欢此前缀,而不是“ my”前缀,但总体上还是不在乎。它对我来说太冗长,将其作为变量名尴尬地读取。在我看来,由于方法名称,将填充范围。 因此,考虑到所有这些因素,我的直觉是带着第一个签名。对我来说,这很干净。不需要时不需要强制使用上下文。但是,我是否对自己或将来的开发人员不利于此约定?我违反最佳做法了吗?

6
首选类成员还是在内部方法之间传递参数?
假设在一个类的私有部分中有一个供多个私有方法使用的值。人们喜欢将其定义为类的成员变量还是将其作为参数传递给每个方法?为什么? 一方面,我可以看到一个论点,即减少类中的状态(即成员变量)通常是一件好事,尽管如果在类的所有方法中重复使用相同的值,那似乎是一个理想的选择。表示为类状态的候选对象,以使代码看起来更清晰(如果没有其他内容)。 编辑: 为了澄清提出的一些评论/问题,我不是在谈论常量,这与任何特定情况都没有关系,而只是与其他人谈论的一种假设。 暂时忽略OOP角度,以下是我想到的特定用例(假设通过引用传递只是为了使伪代码更整洁) int x doSomething(x) doAnotherThing(x) doYetAnotherThing(x) doSomethingElse(x) 所以我的意思是,多个功能之间存在一些共同的变量-在我看来,这是由于较小功能的链接所致。在OOP系统中,如果这些都是类的所有方法(例如,由于通过从大型方法中提取方法进行重构而导致的结果),则该变量可以全部传递给它们,也可以是类成员。

9
如何命名既执行任务又返回布尔值作为状态的方法?
如果有办法 bool DoStuff() { try { // doing stuff... return true; } catch (SomeSpecificException ex) { return false; } } 它应该被称为IsStuffDone()吗? 用户可能会误解这两个名称:如果名称是DoStuff()为什么它返回布尔值?如果名称IsStuffDone()不明确,则该方法是执行任务还是仅检查其结果。 这种情况有约定吗?还是一种替代方法,因为这被认为是有缺陷的?例如,在具有输出参数的语言(如C#)中,可以将布尔状态变量作为1传递给方法,而方法的返回类型为void。 编辑:在我的特定问题中,异常处理不能直接委托给调用者,因为该方法是接口实现的一部分。因此,调用者不必负责处理不同实现的所有异常。它不熟悉那些例外。但是,调用者可以处理自定义异常,如npinti的answer和comment中StuffHasNotBeenDoneForSomeReasonException建议的那样。

4
编程语言如何定义函数?
编程语言如何定义和保存函数/方法?我正在用Ruby创建一种解释型编程语言,并且试图弄清楚如何实现函数声明。 我的第一个想法是将声明的内容保存在地图中。例如,如果我做了类似的事情 def a() { callSomething(); x += 5; } 然后,我要在地图中添加一个条目: { 'a' => 'callSomething(); x += 5;' } 这样做的问题是它将变得递归,因为我必须parse在字符串上调用我的方法,该方法在parse遇到字符串时会再次调用doSomething,然后最终将耗尽堆栈空间。 那么,解释型语言如何处理呢?

6
方法提取与基本假设
当我将大方法(或过程或函数)拆分为特定于OOP的问题时,但由于我99%的时间都使用OOP语言,这是我最熟悉的术语,所以请分成许多小方法,我经常发现自己对结果不满意。与这些小方法只是大代码中的代码块相比,要推理这些方法变得更加困难,因为当我提取它们时,我失去了很多来自调用者上下文的基础假设。 后来,当我查看这段代码并看到各个方法时,我不立即知道它们从何处调用,而是将它们视为可以从文件中任何位置调用的普通私有方法。例如,想象一下一个初始化方法(构造方法或其他方法)分成一系列小的方法:在方法本身的上下文中,您清楚地知道对象的状态仍然无效,但是在普通的私有方法中,您可能会假设该对象已经初始化并且处于有效状态。 我所看到的唯一解决方案是whereHaskell中的子句,该子句允许您定义仅在“父”函数中使用的小函数。基本上,它看起来像这样: len x y = sqrt $ (sq x) + (sq y) where sq a = a * a 但是我使用的其他语言没有这样的东西-最近的事情是在本地范围内定义lambda,这可能会更加令人困惑。 因此,我的问题是-您是否遇到了这个问题,甚至看到了这个问题吗?如果这样做,通常如何解决,特别是在“主流” OOP语言中,例如Java / C#/ C ++? 编辑重复项:正如其他人所注意到的,已经有讨论拆分方法的问题和只有一线的小问题。我阅读了它们,他们没有讨论可以从调用者的上下文派生出来的基础假设的问题(在上面的示例中,对象已初始化)。这就是我的问题的重点,这就是为什么我的问题与众不同。 更新:如果您关注下面的问题和讨论,您可能会喜欢John Carmack的这篇文章,尤其是: 除了了解正在执行的实际代码外,内联函数还具有无法从其他位置调用该函数的好处。这听起来很荒谬,但是有一点是正确的。随着代码库在多年使用中的增长,将有很多机会采用快捷方式并仅调用仅执行您认为需要完成的工作的函数。可能有一个FullUpdate()函数调用PartialUpdateA()和PartialUpdateB(),但是在某些特定情况下,您可能意识到(或认为)您只需要执行PartialUpdateB(),并且通过避免使用其他方法可以提高效率。工作。大量的错误源于此。大多数错误是由于执行状态不完全符合您的想法而导致的。

6
类使用其自己的公共方法可以吗?
背景 我目前遇到一种情况,即我有一个设备同时发送和接收的对象。该消息具有以下几种构造: public void ReverseData() public void ScheduleTransmission() 该ScheduleTransmission方法需要调用ReverseData时,它被称为方法。但是,有时我需要从应用程序中实例化对象的地方进行ReverseData外部调用(并且应该完全在命名空间之外添加)。 至于“接收”,我的意思是ReverseData将在object_received事件处理程序中从外部调用该请求以撤消数据。 题 对象调用其自己的公共方法通常可以接受吗?

3
“加号”和“减号”是否合适?
的Java SE 8自带的日期,引入了新的机制LocalDate,LocalTime以及LocalDateTime类来表示的时刻。为了操纵这些瞬间,给出了一组方法:LocalDate.plusDays(...),LocalDate.minusDays(...)依此类推。 我一直认为,好的做法是在动词后描述方法的目的来命名方法,因为方法实际上是要执行的操作,它们会执行某种动作。刚才说了,如果你考虑类,比如StringBuilder,例如,方法的名字是append,insert,delete... 这就是为什么我不健全的权利命名的方法plusDays来代替sumDays,minusDays而不是subtractDays。只是我觉得很烦吗?你怎么看? 我能想到的唯一原因是日期是不可变的对象,因此通过调用plusDays您不是在原始对象上添加日期,而是创建具有新属性的新对象,但这非常微妙。

12
在局部变量(例如,employeeCount,firstName)中的第一个单词使用小写的原因是什么?
由于我对所有变量都使用了完全正确的大小写形式,因此引起了其他程序员的大量批评。例如,您的典型程序员将使用employeeCount变量名,但我使用EmployeeCount。我对所有内容都使用完全正确的大小写,无论是void方法,return方法,变量,属性还是常量。我什至在Javascript中都遵循此约定。最后一个确实震撼了人们的傻瓜。 关于为什么我不应该遵循这种“非标准”大写字母约定的典型原因是,应为属性和void方法保留完整的适当大小写。局部变量和返回值的方法的首字母应小写,例如int employeeCount = getEmployeeCount()。 但是,我不明白为什么。 当我对此提出疑问时,似乎只能得到一个任意的答案,那就是标准。不管答案是什么,它通常总是归结为这就是它的样子,我对此并不怀疑。我只是跟随它。。任意答案对我来说永远不够好。 自从使用Office IDE对Excel 97宏进行编程的早期开始,我就不需要用大小写约定来告诉我某些东西是局部变量还是属性。这是因为我一直使用非常直观的命名约定。例如,GetNuggetCount()很明显地提出了一种方法,该方法可以计算所有矿块的数量。 SetNuggetCount(x)建议您为块数分配一个新值。 NuggetCount所有这些本身都暗示了仅包含值的属性或局部变量。对于最后一个,可能会想说:“啊哈!这是问题。属性或变量?这是什么?” 为此,我会回答:“这真的重要吗?” 因此,这就是tl; dr ;:在变量或return方法中的第一个单词使用小写字母的客观,逻辑,非任意原因是什么? 编辑: 对于MainMa 将此代码替换为答案中的第一个代码示例,然后查看您的论点是否成立: public void ComputeMetrics() { const int MaxSnapshots = 20; var Snapshots = this.LiveMeasurements.IsEnabled ? this.GrabSnapshots(MaxSnapshots, this.cache) : this.LoadFromMemoryStorage(); if (!Snapshots.Any()) { this.Report(LogMessage.SnapshotsAreEmpty); return; } var MeasurementCount = Measurements.Count(); this.Chart.Initialize((count + 1) …

5
为什么将单元测试专用方法视为不良做法?
内容: 我目前正在使用Python进行一个小项目。我通常使用一些公开的方法来构造我的类,这些方法已记录在案,但主要处理高级概念(类的用户应了解和使用的内容),以及一堆隐藏的(从下划线开始)负责方法的类。复杂或低级别的处理。 我知道测试对于确保代码的信心并确保以后进行的任何修改都不会破坏以前的行为至关重要。 问题: 为了在受信任的基础上构建更高级别的公共方法,我通常会测试私有方法。我发现查找代码修改是否已引入回归以及在何处更容易。这意味着这些内部测试可能会因次要修订而中断,并且需要修复/替换 但是我也知道,单元测试私有方法至少是一个有争议的概念,或者更经常被认为是不好的做法。原因是:仅应测试公共行为(参考) 题: 我确实关心以下最佳做法,并希望了解: 为什么在私有/隐藏方法上使用单元测试不好(有什么风险)? 当公共方法可以使用低级和/或复杂处理时,最佳实践是什么? 精度: 这不是一个如何的问题。Python没有真正的隐私概念,隐藏的方法根本没有列出,但是当您知道它们的名称时就可以使用 我从没学过编程规则和模式:我的上一堂课是80年代的...我主要通过尝试和失败以及在Internet上的引用来学习语言(多年来,Stack Exchange是我的最爱)

11
有什么更好的IllegalStateException或无声方法执行?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 假设我有一个MediaPlayer类,该类具有play()和stop()方法。如果以前没有调用过play方法,则在实现stop方法时使用的最佳策略是什么。我看到两个选项:由于播放器未处于适当状态而引发异常,或无提示地忽略对​​stop方法的调用。 当在某些情况下不应该调用某个方法但该方法的执行对程序总体无害时,一般规则应该是什么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.