软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

7
使类方法传递类变量是一个坏主意吗?
这就是我的意思: class MyClass { int arr1[100]; int arr2[100]; int len = 100; void add(int* x1, int* x2, int size) { for (int i = 0; i < size; i++) { x1[i] += x2[i]; } } }; int main() { MyClass myInstance; // Fill the arrays... myInstance.add(myInstance.arr1, myInstance.arr2, myInstance.len); } add因为它是一个类方法,已经可以访问它需要的所有变量了,所以这不是一个好主意吗?有什么理由我应该或不应该这样做?

3
如何影响开发人员的错误优先级并相应地加以对待?
我们正在执行一个错误流程。 我们有3个错误级别: P1错误:阻止用户工作的错误。他们必须当场解决。 P2错误:有影响但用户可以使用的错误 P3错误:不会影响用户并可以在其中工作的错误。 P1是强制性的,必须当场处理。但是对于P2和P3,我们将根据具体情况进行判断。 我们拥有3个级别,因此团队倾向于根据客户的要求进行更紧迫的新开发,而不必处理P2和P3,这几乎很紧急。 问题如下: 我是否应该添加另一个优先级,例如拥有P4? 我是否还应该像本周一样为他们指定处理非紧急票证的目标,当不分配编码任务时,您应至少处理1个P2? 当前,我们没有像我上面提出的目标,但是我担心的是给他们这样的目标可能是残酷的。可以确定的是,我需要与他们讨论目标,团队喜欢参与讨论,尤其是在设定目标时。 更新: 我从相似性的角度提出了这个问题。但是,它根本不相似。 我的问题是如何让人们处理错误,而又不施加严格的议程却仍要解决它。因此,不,所隐含的问题对我没有帮助。不过还是谢谢你

4
如何有效搜索某个地标范围内的所有地标?
我正在尝试从一个地理搜索项目开始,该项目将查找特定地标的10公里/英里(对于这个故事而言并不重要)中的所有地标。 例如,假设我有一个包含1,000,000个地标的数据库。为了找到具有特定坐标的地标10英里范围内的所有地标,我必须计算搜索到的地标与1,000,000个地标之间的距离。 有更好的方法吗? 我当时想过的替代方法是对地标进行分类,例如国家,地区,城市,邻里,商业,历史等,以便企业可以成为邻里或城市的一部分。城市是一个地区,一个国家等的一部分。这可以缩小计算范围,但是为了快速,准确地进行搜索,它仍然看起来像需要做很多工作。 Google Maps API可以提供帮助吗?

4
软件体系结构在多大程度上取决于语言?
在向我介绍软件体系结构和设计模式时,我注意到在大多数情况下,解释中都隐含了某些语言功能和设计细节。 例如,几乎任何文章或书籍都将使用类和接口来说明思想。在该主题上可以轻松找到的所有内容都会提到对象和OOP概念。 如果编写系统的语言根本没有这样的概念怎么办?例如,如果我使用动态类型且没有接口概念的Python或Node,该怎么办?如果我在接口是短暂构造(在运行时中不存在)的情况下使用TypeScript怎么办?如果我尝试使用函数式编程该怎么办?我应该忽略例如SOLID并寻找其他适合我的语言的概念吗? 如果是,那是什么?不幸的是,据我所知,所有公认的范例都以某种方式引用了OOP概念和类型。如果没有,那么在将通用的体系结构和设计原则适应我的特定语言和用例时应该遵循哪些规则? 您一般如何描述体系结构和语言之间的依赖关系?

5
是否可以在不增加耦合的情况下应用DRY?
假设我们有一个实现功能F的软件模块A。另一个模块B实现了与F'相同的功能。 有多种方法可以消除重复的代码: 让A使用B的F'。 让B使用A中的F。 将F放入自己的模块C中,让A和B都使用它。 所有这些选项都会在模块之间生成其他依赖关系。他们以增加耦合为代价应用了DRY原理。 据我所知,在应用DRY时,耦合总是增加或至少增加到更高的水平。软件设计的两个最基本的原则之间似乎存在冲突。 (实际上,这样的冲突并不令人惊讶。这可能是使良好的软件设计如此困难的原因。我确实感到惊讶的是,通常在介绍性文本中未解决这些冲突。) 编辑(为澄清起见):我认为F和F'的相等不只是一个巧合。如果必须修改F,则很可能必须以相同的方式修改F'。

5
如何处理运行太久的冲刺计划?
我花了5个小时以上的冲刺计划来进行为期一周的冲刺。似乎太过分了。 由于大多数团队成员都不高级,因此我们将在sprint计划中详细讨论事情。如果我们不这样做,将会在实现过程中导致错误,并在sprint过程中进行重新设计。 我们该如何处理? 我应该在计划期间讨论多少细节,以使其适合每周冲刺仅2小时的时间?
14 agile  scrum  planning  sprint 


4
在多态性的背景下,如何处理为子类型添加的方法?
当使用多态性的概念时,您将创建一个类层次结构,并使用父代引用来调用接口函数,而无需知道对象具有哪种特定类型。这很棒。例: 您有动物的集合,并且可以调用所有动物的功能,eat而不必关心它是吃狗还是猫。但是在同一个类层次结构中,您的动物除了从类继承和实现Animal(例如makeEggs,getBackFromTheFreezedState等等)外,还具有其他动物。因此,在某些情况下,您可能需要了解调用其他行为的特定类型。 例如,如果是早晨,如果它只是一只动物,那么您可以致电eat;否则,如果是人类,那么请首先致电washHands,getDressed然后再致电eat。如何处理这种情况?多态性死亡。您需要找出对象的类型,这听起来像是代码气味。是否有处理这种情况的通用方法?


4
当您不知道某物如何实际工作时,该如何编码?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 2年前关闭。 我最近学习了C,并且想启动一个项目来巩固我的知识。我决定制作一个非常简单的文本编辑器,例如vim。我面临的问题是,我真的不知道文本编辑器的工作原理,也不知道可以从谷歌那里学到什么。 对其进行谷歌搜索导致了vim的GitHub回购,这对我来说毫无用处,因为代码库很大而且代码使我感到困惑。我还找到了使用C制作文本编辑器的教程,其功能类似于vim。 尽管我考虑过学习这些教程,但感觉却像在作弊。vim开发人员如何在没有特定教程的情况下弄清楚如何编码vim?还是从更简单的文本编辑器开始?他们如何仅从语言知识及其文档中找出答案? 在不直接遵循教程的情况下开始编写此文本编辑器到底需要什么?我想想到的另一个示例是:Dennis Ritchie和Ken Thompson如何编写Unix的代码?我对OS的功能有所了解,但对如何将其放入代码中一无所知。我想念的是什么?如何将这种语言知识转化为实际的实际使用?
14 c  languages 

3
RxJava类Flowable是否可以合法地使用460个方法?
我刚刚开始使用RxJava,它是Java对ReactiveX的实现 (也称为Rx和Reactive Extensions)。一些真正让我吃惊的庞大规模RxJava的可流动类:它具有460点的方法! 公平起见: 有很多方法被重载,这大大增加了方法的总数。 也许应该拆分此类,但是我对RxJava的知识和理解非常有限。谁创造RxJava的人肯定是非常聪明的,他们可以大概是选择创建提供有效的参数可流动有这么多的方法。 另一方面: RxJava是Microsoft的Reactive Extensions的Java实现,甚至没有Flowable类,因此,这不是盲目移植现有类并用Java实现的情况。 [ 更新:斜体前一点是事实不正确:微软的可观察类,其中有超过400的方法,被用来作为RxJava的基础上可观察类,并且可流动相似,可观察到,但手柄背压的大量数据。因此,RxJava团队正在移植现有的类。这篇文章应该是挑战的原设计可观察到由微软而不是RxJava的类悬浮剂分类] RxJava已有3年多的历史了,因此这并不是由于缺乏对良好(SOLID)类设计原理的了解而导致代码被错误设计的示例(与Java的早期版本一样)。 对于像Flowable这样大的类,其设计本质上是错误的,但也许不是。这个SE问题的一个答案一个类方法的数量限制是多少?建议答案是“ 拥有所需的多种方法 ”。 显然,有些类无论其语言如何,都合法地需要大量方法来支持它们,因为它们不会轻易分解为更小的东西,并且它们具有大量的特征和属性。例如:字符串,颜色,电子表格单元格,数据库结果集和HTTP请求。对于类来说,也许有几十种方法来表示这些东西似乎并不合理。 但是Flowable是否真的需要460种方法,还是它是如此之大以至于它必然是不良类设计的一个例子? [需要明确的是:这个问题,特别是涉及RxJava的可流动类,而不是一般的神的对象。]

6
淘汰过时的数据库列的最佳实践是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我正在设计一个应用程序,它将在早期阶段从客户端收集数据A,B和C,但稍后将收集数据A,B和D。 A,B,C和D非常相关,现在作为单个数据库PostgreSQL表T的列存在。 一旦不再需要C,我想从我的应用程序中删除它的引用(我使用Django ORM),但是我想保留已经输入的数据。最好的方法是什么? 我曾考虑过为ABD创建一个新表,但这意味着可能会导致引用表T的任何行出现问题。 我可以只保留C列,并删除代码中对它的引用,以使现有数据得以保留。 有没有我看不到的更好的选择? 一些额外的细节: 行数不会很大,很可能每个用户1-2行。这是一个大众市场应用程序,但是当我从C切换到D时,用户群还不会很大。尽管有可能,但C和D可能不会同时收集。C和D可能分别代表多个列,而不仅仅是每个列。

6
单线与可读性:何时停止减少代码?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 语境 我最近对产生更好的格式化代码感兴趣。更好的意思是“遵循足够多的人认可的规则,将其视为一种良好的做法”(当然,因为永远不会有一种独特的“最佳”编码方式)。 如今,我主要使用Ruby进行编码,因此我开始使用linter(Rubocop)为我提供一些有关代码“质量”的信息(此“质量”由社区驱动的项目ruby-style-guide定义)。 请注意,我将使用“质量”作为“质量格式化的”,与其说是对代码的效率,即使在某些情况下,代码效率实际上是由代码是怎么写的影响。 无论如何,做完所有这些事情,我意识到(或至少记得)一些事情: 一些语言(最著名的是Python,Ruby等)允许编写出色的一线代码 遵循一些代码准则,可以使代码大大缩短,但仍然非常清晰 但是,过于严格地遵循这些准则会使代码不太清晰/不易阅读 该代码几乎可以完全遵守某些准则,但质量仍然很差 代码的可读性主要是主观的(如“我发现对开发人员完全不清楚的内容”) 这些只是观察,并非绝对的规则。您还将注意到,此时代码的可读性和遵循的准则似乎无关紧要,但此处的准则是一种缩小重写代码块的方式的方法。 现在,举一些例子,使所有这些变得更加清楚。 例子 我们来看一个简单的用例:我们有一个带有“ User”模型的应用程序。用户具有可选firstname和surname必填email地址。 我想编写一个方法“ name”,firstname + surname如果至少存在用户firstname或,则将返回该用户的名称(),如果没有,则返回surname其email后备值。 我还希望此方法采用“ use_email”作为参数(布尔值),从而允许将用户电子邮件用作后备值。此“ use_email”参数应默认(如果未传递)为“ true”。 用Ruby编写最简单的方法是: def name(use_email = true) # If firstname and surname are both blank (empty string or undefined) # and we can use the email... …

1
为什么LLVM具有类似程序集的IR,而不是类似树的IR?或者:为什么项目针对LLVM IR而不是clang的AST?
为什么LLVM的中间表示(LLVM IR)类似于树而不是像树? 或者,为什么语言实现针对LLVM IR而不是clang的AST? 我不是想立刻问两个不同的问题。在我看来,似乎客户和库程序员都已达成共识,LLVM的API(仅此而已)显然是好的软件设计,我的问题是“为什么?”。 我问的原因是,如果IR类似于AST,LLVM似乎可以为前端提供更多功能,因为那时clang基于AST的工具可以用于任何前端。另外,如果针对LLVM IR的语言针对clang的AST,则可以获得更多功能。 Clang具有用于创建和使用AST的类和函数,并且它是唯一与LLVM项目紧密相关的前端项目,那么为什么clang的AST功能在LLVM外部? 在我的头顶上,我知道Rust(rustc),D(ldc)和Haskell(GHC)都可以使用LLVM作为后端,但是它们不使用Clang AST(据我所知,我可以是错的)。我不知道这些编译器的所有内部细节,但是至少Rust和D当然看起来可以将它们编译为clang的AST。也许Haskell也可以,但是我对此不太确定。 这是因为历史原因(LLVM最初是“低级虚拟机”,后来出现了clang)吗?这是因为其他前端希望对提供给LLVM的内容进行尽可能多的控制吗?clang的AST不适合“非C类”语言是否有根本原因? 我不希望这个问题成为阅读中的练习。我只是希望它对那些对编译器设计感到好奇但还不太熟练的人有所帮助。由于LLVM和clang项目是公开开发的,所以我希望熟悉这些项目开发的人员可以回答,或者希望答案对于某些自己有足够信心回答的书呆子很明显。 抢占一些显而易见但不令人满意的答案: 是的,拥有类似程序集的IR可以使制作IR的人获得更多控制权(也许X lang比clang更好的代码库和AST格式),但是如果这是唯一的答案,那么问题就变成了“为什么LLVM 仅具有程序集-例如IR,而不是高级树状IR和底层程序集IR?”。 是的,将编程语言解析为AST并不难(至少与其他编译步骤相比)。即使这样,为什么还要使用单独的AST?如果没有其他问题,则使用相同的AST可以使您使用在AST上运行的工具(即使只是简单的东西,例如AST打印机)。 是的,我强烈同意,更加模块化是一件好事,但如果这是唯一的原因,那么为什么其他语言的实现往往针对LLVM IR代替铛的AST? 这些先发制人可能是错误的或忽略了细节,因此,如果您有更多细节或我的假设有误,请随时提供这些答案。 对于任何想回答一个更为明确的问题的人:类组装IR与树形IR的优缺点是什么?

7
原始vs类代表简单的域对象?
什么时候使用特定于域的对象与普通字符串或数字的通用准则或经验法则是什么? 例子: 年龄层vs整数? FirstName类与String? 唯一ID与字符串 PhoneNumber类vs字符串vs长? 域名类与字符串? 我认为大多数OOP从业人员肯定会说PhoneNumber和DomainName的特定类。有关使它们变得有效以及如何进行比较的更多规则,使简单的类更易于处理和更安全。但是对于前三个,还有更多的争论。 我从来没有遇到过“年龄”类,但是有人认为它必须是非负数是有道理的(好吧,我知道您可以为负数年龄辩护,但这是一个很好的例子,它几乎等同于原始整数)。 字符串通常代表“名字”,但并不是完美的,因为空字符串是有效字符串,但不是有效名称。比较通常会忽略大小写。当然,有一些方法可以检查是否为空,不区分大小写,等等,但这需要使用者执行此操作。 答案是否取决于环境?我主要关心的是企业/高价值软件,该软件可以生存和维护超过十年。 也许我想得太多了,但是我真的很想知道是否有人对何时选择类还是原始有规则。

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.