软件工程

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

3
“是否更改4的值?”-Hayes-Thomas测验是如何进行的?
1989年,李·费利克斯(Felix Lee),约翰·海斯(John Hayes)和安吉拉·托马斯(Angela Thomas)进行了一次黑客测验,形式是带有许多内部笑话的测验,如:“ 你吃粘泥吗?” 我正在考虑以下系列: 0015 Ever change the value of 4? 0016 ... Unintentionally? 0017 ... In a language other than Fortran? 在系列中是否存在使数字“ 4”特别的轶事? 是否有某些Fortran实现允许修改常量的值?当时可以用其他常用语言来实现吗?
24 history  fortran 

10
在OOP中似乎需要循环引用的现实活动建模的正确方法是什么?
我一直在努力解决Java项目中有关循环引用的问题。我正在尝试对现实世界中的情况进行建模,在这种情况下,所讨论的对象似乎是相互依赖的,并且需要彼此了解。 该项目是玩棋盘游戏的通用模型。基本类是非特定类,但已扩展为处理国际象棋,西洋双陆棋和其他游戏的特定类。11年前,我用六种不同的游戏将其编码为applet,但问题是它充满了循环引用。那时,我通过将所有相互交织的类填充到一个源文件中来实现它,但是我意识到这在Java中是不好的形式。现在,我想实现与Android应用类似的功能,并且我想正确地执行操作。 这些类是: RuleBook:可以针对诸如棋盘的初始布局,其他初始游戏状态信息(例如谁先移动,可用的移动,可用的移动,提议的移动后游戏状态发生了什么)等问题进行询问的对象。当前或提议的董事会职位。 棋盘:游戏棋盘的简单表示,可以指示其反映移动。 MoveList:移动列表。这是双重目的的:在给定的位置选择可用的动作,或者在游戏中进行的动作列表。它可以分为两个几乎相同的类,但这与我要问的问题无关,并且可能会使它进一步复杂化。 搬家:一招。它以原子列表的形式包含了有关移动的所有内容:从这里拿起一块,放到那里,从那里取出被捕获的一块。 状态:正在进行的游戏的完整状态信息。不仅是董事会的位置,而且还有MoveList以及其他状态信息,例如现在要移动的人。在国际象棋中,将记录每个棋手的国王和乌鸦是否已移动。 例如,循环引用比比皆是:RuleBook需要了解游戏状态以确定给定时间可用的棋步,但是游戏州需要查询RuleBook的初始开始布局以及一次棋步会带来哪些副作用它是制造出来的(例如,下一个移动者)。 我尝试分层组织新的类集,其中RuleBook位于顶部,因为它需要了解所有信息。但这导致必须将许多方法移至RuleBook类中(例如进行移动),从而使其成为整体,并不能特别代表RuleBook应该是什么。 那么组织此活动的正确方法是什么?我应该将RuleBook变成BigClassThatDoesAlmostEverythingInTheGame以避免循环引用,而放弃对真实游戏进行精确建模的尝试吗?还是应该坚持使用相互依赖的类并哄骗编译器以某种方式对其进行编译,同时保留我的实际模型?还是我缺少一些明显的有效结构? 谢谢你提供的所有帮助!

1
单个python文件分发:模块还是包?
假设我有一个有用的python函数或类(或任何类)useful_thing,该函数或类存在于单个文件中。本质上有两种组织源树的方法。第一种方法使用单个模块: - setup.py - README.rst - ...etc... - foo.py 在useful_thing中定义的位置foo.py。第二种策略是制作一个包装: - setup.py - README.rst - ...etc... - foo |-module.py |-__init__.py 在useful_thing中定义的位置module.py。在包装的情况下__init__.py看起来像这样 from foo.module import useful_thing 这样在两种情况下都可以from foo import useful_thing。 问题:首选哪种方式,为什么? 编辑:由于用户说这个问题的格式不正确,因此我要补充一点,官方python打包教程似乎并未评论上述哪种方法是首选方法。我明确不提供自己的利弊清单,因为我对是否存在社区首选方法感兴趣,而不是对利弊进行讨论:)

6
为什么将词法分析器实现为二维数组和巨型开关?
我正在慢慢地完成学业,这个学期是Compilers101。我们正在使用Dragon Book。在课程开始不久,我们将讨论词法分析以及如何通过确定性有限自动机(以下称DFA)来实现它。设置各种词法分析器状态,定义它们之间的过渡等。 但是教授和这本书都建议通过过渡表来实现它们,过渡表相当于一个巨大的2d数组(一个维的各种非终端状态,而另一个维可能的输入符号),以及一个用于处理所有终端的switch语句以及在非终端状态下调度到过渡表。 这个理论很好,但是作为一个几十年来实际编写代码的人,实现是不道德的。它不可测试,不可维护,不可读,调试起来很麻烦。更糟糕的是,如果该语言具有UTF功能,那么我将看不到它在远程实用。每个非终端状态都有一百万个左右的过渡表条目,这会很不方便。 那怎么办?为什么有关该主题的权威书籍说要这样做呢? 函数调用的开销真的那么多吗?当语法不为人所知时(正则表达式?),这是否行得通?也许可以处理所有情况的东西,即使更具体的解决方案更适合于更具体的语法? (注意:可能重复的“ 为什么使用OO方法而不是巨大的switch语句? ”已经很接近了,但我并不关心OO。使用功能性方法甚至具有独立功能的更明智的命令式方法都可以。) 并且为了示例,考虑一种仅具有标识符的语言,而这些标识符为[a-zA-Z]+。在DFA实施中,您将获得以下内容: private enum State { Error = -1, Start = 0, IdentifierInProgress = 1, IdentifierDone = 2 } private static State[][] transition = new State[][]{ ///* Start */ new State[]{ State.Error, State.Error (repeat until 'A'), State.IdentifierInProgress, ... ///* IdentifierInProgress */ new …

2
当电源关闭时,Git的提交有多健壮?
有一天,我正在使用Git(我仍在使用它),而在提交时,电力中断了。 当我(实际上是电力)回来时,git repo损坏了。我不记得确切的名字了,但这是“无效的引用”之类的东西。 很容易猜到该提交在操作过程中被破坏了(我是通过IntelliJ提交的,它会自动进行索引添加)。也很容易猜到,实际上,“提交”不像具有相同名称的DBMS操作那样具有ACID。 问:有没有办法确保回购变更操作尊重原子性?即,如果电力再次下降,并且我要提交,我希望我的文件系统不处于损坏状态。
24 git 

4
插件应该使用什么:钩子,事件或其他东西?
考虑一个允许插件对其程序流做出反应的应用。 我知道两种方法可以实现:钩子和事件 1.挂钩 在主程序流中使用调用来清空函数。插件可以覆盖这些功能。 例如,Drupal CMS实现了可用于模块和主题的挂钩。这是在file_copy函数中如何实现钩子的示例。 function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) { // ... [File copying routine] // Inform modules that the file has been copied. module_invoke_all('file_copy', $file, $source); return $file; // ... } 模块可以实现modulename_file_copy($file, $source)将由module_invoke_allin 调用的功能file_copy。该功能完成后,file_copy将恢复执行。 2.活动 拥有应用程序分发事件,插件可以监听该事件。收到已订阅的事件后,插件将拦截程序流并执行必要的操作。 例如,一个jQuery画廊插件Fotorama 实现了几个事件。例如,这show是触发fotorama:show事件的方法的一部分。 that.show = function (options) { …

8
需要按特定顺序调用功能的接口设计
任务是根据一些输入规范在设备内配置硬件。这应该通过以下方式实现: 1)收集配置信息。这可能在不同的时间和地点发生。例如,模块A和模块B都可以(在不同时间)向我的模块请求一些资源。这些“资源”实际上就是配置。 2)在明确不再需要更多请求之后,需要将给出所请求资源摘要的启动命令发送到硬件。 3)只有在此之后,才能(并且必须)对所述资源进行详细配置。 4)另外,只有在2)之后,才能(并且必须)将所选资源路由到已声明的调用方。 导致错误的一个常见原因,即使是写这个东西的我来说,也是错误地遵循了这个顺序。我可以采用什么命名约定,设计或机制来使界面对第一次看到该代码的人可用?
24 c++  interfaces 

4
如何使用github,分支机构和自动发布进行版本管理?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 到目前为止,我已经了解了大多数基本的Git / Github概念,但是仍然很难理解全局。 到目前为止,我已经设法使这些事情起作用: 推送提交 与分支机构合作 将Github与Travis CI(一个持续集成系统)集成 通过Travis CI,可以自动构建对master的每次提交,并将该发行版作为ZIP放在Github上的发行版之下。 但是到目前为止,我只从事项目的alpha / beta版本工作,因此我还从未见过实践中的版本发布。 因此,我想了解更多有关版本控制,维护单独的版本,修复版本等信息。 我将如何确保发生以下情况: 我的项目有不同的版本,例如版本1.1.0和2.0.0 能够在版本上推送修补程序,将版本提高到1.1.1或2.0.1,等等。 使一个持续集成系统在提交时自动构建该版本,如果成功,则发布该特定版本的发行版。 我怀疑以下选项之间: 每个版本都需要使用标签吗?如果是这样,一个持续集成系统如何构建自动发布? 我应该为每个版本创建分支吗?如果是这样,那将不会创建大量的分支(例如1.1和2.0分支,修补程序当然会进入该分支) 我将如何指定版本号?是否可以使用一个指定版本号的配置文件,还是可以使用更智能的方法?在这种情况下,这很重要,这将是一个Java项目。

6
量化现代版本控制系统的优势[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在过去的三年中,我一直在大型金融企业环境中担任团队负责人/开发人员。我们的产品发布过程是一场噩梦,因为它围绕Clearcase展开。我们有一个变更管理小组,负责执行所有版本,并且只允许将代码从生产中带入生产。 加入时,我要做的第一件事就是与Git建立团队。每个人都同意,Clearcase太糟糕了,对于处理日常源代码控制事务不切实际。因此,我们在本地计算机上建立了一种“非官方”存储库,并编写了一个脚本以在发布时同步git和Clearcase存储库。 这句话传给其他团队,有几个团队采用了相同的过程。以“非官方”方式使用git进行日常活动,以“官方”方式使用Clearcase进行发布。对于Git的任何问题,我都非常喜欢。 因此,本周我将与基础架构变更高级副总裁开会,他特别希望我向她解释Git的优点。显然,我在Clearcase上听到了我的常识。如果她接受我的论点,我将真正帮助我的雇主摆脱这种可憎的事情。 我与高管的经验告诉我,他们a)想要对所有事物进行极为简洁的解释b)只对涉及美元数据的事实感兴趣 我可以向开发人员解释Git优于Clearcase的优点(或针对此问题的Clearcase的任何其他版本控制系统),但是我正在向没有技术背景的技术主管说明如何做到这一点(她有一个工商管理硕士(MBA),并取得地理学本科学位。 我觉得我对她的任何争论要么听起来像是胡言乱语,要么是我在宣扬自己的个人喜好。 我要查找的是具体事实,这些事实表明开发人员可以更有效地使用Git或任何现代源代码控制系统。 我认为其他团队已经开始在内部使用Git是一个有意义的信号,但是它仍然不够强大,因为它仍然可以作为个人喜好而忽略。 我真正需要的是一个足以突破“这个过程已经工作了20年,为什么我们要改变它呢?”的功能。论点。

4
与视障同事计划扑克
在办公室,我们刚遇到一个视力障碍的新同事。 我负责组织计划扑克会议,新同事必须作为团队成员参加。我们有这些漂亮的扑克牌集,上面有计划的扑克号码,但这对我们的新同事当然没有帮助。 到现在为止,我们仅通过命名估算值来解决此问题,让新同事在其余人放下他们的卡后立即说出他们的估算,然后其余人翻转他​​们的卡,我将其连续命名。 我的问题:是否有人在这种情况下有经验并有更好的解决方案?有盲文扑克牌吗? 当前的解决方案确实有效,但是我认为可以通过例如盲文扑克牌为我们所有人改善这一点。


6
为什么LMAX的团队为什么要使用Java并设计架构以避免不惜一切代价避免GC?
为什么LMAX的团队为什么要用Java 设计LMAX Disruptor,但所有设计都着眼于最大限度地减少GC使用?如果不想运行GC,那么为什么要使用垃圾回收语言? 他们的优化,硬件知识水平和他们的想法都很棒,但是为什么要使用Java? 我不反对Java或其他任何东西,但是为什么要使用GC语言?为什么不使用不带GC的D之类的语言或其他语言却允许高效的代码呢?是团队最熟悉Java还是Java拥有我没有看到的某些独特优势? 假设他们使用带有手动内存管理功能的D进行开发,会有什么区别?他们将不得不考虑低级(他们已经是),但是他们可以从系统本身中榨取最佳性能。

2
我应该自己编写HTTP状态代码吗?(如Twitter 420:增强您的冷静)
此问题已从“服务器故障” 迁移而来,因为可以在软件工程堆栈交换中进行回答。 迁移 6年前。 我目前正在实现HTTP API,这是我的第一次。 我已经花了很多时间在Wikipedia页面上查看HTTP状态代码,因为我决心在正确的情况下实现正确的代码。在该页面上列出的是编号为420的代码,这是Twitter用来限制速率的自定义代码。 但是,已经存在用于速率限制的代码。是429。 这使我想知道为什么在已经存在用例的情况下,他们为什么要设置自定义的呢?那只是可爱吗?如果是这样,那么在什么情况下可以接受返回不同的状态代码,客户可能会遇到什么问题呢? 我在某个地方读到Mozilla并未实现笑话418: I’m a teapot响应,这使我认为客户端选择了他们实现的状态代码。如果这是真的,那么我可以想象Twitter的有趣之处可以增强您的冷静代码带来的麻烦。 除非我弄错了,否则我们可以使用任何代码号来表示我们喜欢的任何东西,并且只有约定表明404表示未找到,而429表示则很容易。
24 api-design  http 

3
Python-'if foo in dict'vs'try:dict [foo]'
我想这不是关于鸭子类型的本质的问题,而是关于保持pythonic的问题。 首先-当处理字典时,尤其是当字典的结构是相当可预测的并且给定的密钥通常不存在但有时存在时,我首先想到两种方法: if myKey in dict: do_some_work(dict[myKey]) else: pass 当然,Ye Olde的“宽恕与许可”方法。 try: do_some_work(dict[myKey]) except KeyError: pass 作为一名Python的熟练手,我觉得后者是很多人的首选,我觉得这很奇怪,因为在Python文档中try/excepts,当出现实际错误时,似乎是首选,而不是…… 没有成功? 如果偶然的dict在myDict中没有密钥,并且已知它并不总是具有该密钥,那么try / except在上下文上是否会引起误解?这不是编程错误,只是数据的事实-该字典没有特定的键。 当您查看try / except / else语法时,这似乎特别重要,当确保try不会捕获太多错误时,这似乎非常有用。您可以执行以下操作: try: foo += bar except TypeError: pass else: return some_more_work(foo) 这是否会导致吞没可能是某些错误代码导致的各种奇怪错误?上面的代码可能只是在阻止您看到您要添加的内容,2 + {}并且您可能永远都不会意识到代码的某些部分出现了严重错误。我不建议我们检查所有类型,这就是为什么它是Python而不是JavaScript的原因-但是在try / except的上下文中,似乎应该捕获程序正在执行的本来应该做的事情,而不是使它能够继续下去。 我意识到上面的例子是一个草率的论点,实际上是故意的。但是,鉴于better to ask forgiveness than permission我的Python信条,我不禁要问一个问题,那就是在if / else与try / …
24 python 

6
为什么不将Java用作构建语言?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 如果Java是一种通用语言,而构建程序可以用Java语言来描述,那么为什么这不是编写构建文件的最佳方法,而是使用Ant,Maven和Gradle之类的工具呢?那不是更直接,而且不需要学习另一种编程语言吗?(顺便说一句-这个问题也可以应用于其他语言,例如C#)
24 java  c#  builds  build-system 

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.