软件工程

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

11
可读的正则表达式又不会失去其功能?
如今,许多程序员都知道快速编写正则表达式的乐趣,这些天通常是在某些Web服务的帮助下,或更传统的是在交互式提示下,或者编写一个正在开发正则表达式的小脚本以及一系列测试用例。 。无论哪种情况,该过程都是迭代的并且相当快:不断破解看起来像神秘的字符串,直到它匹配并捕获您想要的内容,然后拒绝您不需要的内容。 对于一个简单的情况,结果可能是这样的,例如Java regexp: Pattern re = Pattern.compile( "^\\s*(?:(?:([\\d]+)\\s*:\\s*)?(?:([\\d]+)\\s*:\\s*))?([\\d]+)(?:\\s*[.,]\\s*([0-9]+))?\\s*$" ); 许多程序员还知道需要编辑正则表达式或仅在遗留代码库中围绕正则表达式进行编码的痛苦。经过一些编辑后,对于熟悉regexp的任何人来说,regexp仍然很容易理解,regexp的资深人士应立即查看其功能(如果有人想要练习,请在帖子末尾回答自己弄清楚)。 但是,将正则表达式变成真正的只写对象并不需要变得更加复杂,即使有了勤奋的文档(每个人当然会对他们编写的所有复杂正则表达式都执行此操作……),修改正则表达式就变成了艰巨的任务。如果未对regexp进行仔细的单元测试(这当然也是每个人对其所有复杂的regexp的肯定和否定都有全面的单元测试...),这也可能是非常危险的任务。 因此,长话短说,是否存在不损失正则表达式的读写解决方案/替代方案?上面的正则表达式在替代方法下的外观如何?任何语言都可以,尽管最好使用多语言解决方案,但正则表达式是多语言的。 然后,较早的regexp所做的就是这样:解析格式为数字的字符串1:2:3.4,捕获每个数字,其中允许空格,并且只3需要空格。

12
面向对象编程比过程编程有什么好处?
我试图了解过程语言(例如C)和面向对象的语言(例如C ++)之间的区别。我从未使用过C ++,但我一直在和朋友们讨论如何区分两者。 有人告诉我C ++具有面向对象的概念以及定义变量的公共模式和私有模式:C语言没有。在Visual Basic.NET中开发程序时,我从来不需要使用它们:这些有什么好处? 我还被告知,如果变量是公共变量,则可以在任何地方访问它,但是尚不清楚它与C之类的语言中的全局变量有何不同。还不清楚私有变量与局部变量有何不同。 我听到的另一件事是,出于安全原因,如果需要访问某个函数,则应首先继承该函数。用例是管理员应该只拥有所需的权限,而不是所有的权限,但是似乎有条件的也可以工作: if ( login == "admin") { // invoke the function } 为什么这不理想? 鉴于似乎有一种方法性的方法可以完成所有面向对象的编程,所以我为什么要关心面向对象的编程?

6
我应该如何确定编写定制软件的费用?[关闭]
对于可能需要花费一年或更长时间才能开发的定制软件,我将如何确定咨询顾问的费用?我很难提供一个数字,在线搜索提供的数字大不相同(介于$ 55 /小时和$ 300 /小时之间)。 我不想拍得太低,因为这会花费我很多时间(并且我推迟了对这个项目的学习)。我也不想拍得太高,并得到令人不快的外观和理由要求。FWIW我住在加拿大,大约有。十年的开发经验。 我已经读过“拿薪水除以1000”的经验法则,但事实是我没有薪水。目前,我只是为一个正在创办营销公司的朋友做相当小的编程任务,并为每个任务定价。我不知道在一年的时间里我会做什么,但是那会非常低。 我对该项目的职责是某种程度上的体系结构,编程,数据库,服务器和UX。这将是面向公众的Web服务,因此我还需要在安全性和可伸缩性上付出很多努力。 有什么建议或经验吗?

16
一个人的最佳开发方法?
我在很多项目上花费了大量时间,在这些项目中,我是唯一的开发人员,项目经理,设计师,QT人员(是的,我知道...很糟糕!),有时甚至是客户。 我已经尝试了几乎所有用于计划项目和管理自己的事情,从坐下来自由工作直到项目完成(无论花费多长时间),再到单人版的Scrum,我在其中与自己举行了一次进度会议。每天早上烧毁图表(不是在开玩笑)。 对于那些花费大量时间独自工作的人,什么是组织自己,管理大型(一个人)项目并保持尽可能高的生产率的最佳方法?

19
Perl还是有用的,可行的语言吗?[关闭]
我知道以前可能有人问过,但是这里什么都没有... Perl还是有用的东西吗?如果有人是新程序员(对编程完全陌生,或者只有几个月/几年的经验),Perl是否值得学习? Perl是否仍与频率一起使用?它仍然受欢迎吗? 还是与Python,Ruby,PHP,ASP.NET等语言相比,Perl濒临灭绝? 基本上可以归结为: 仍在使用/仍经常使用吗?如果是,它快死了吗?如果否,它会回来吗? 这是值得学习的东西吗? 在流行度和可用性/可行性方面,它如何与Python之类的需求进行比较?是否可以将Python或Ruby之类的语言视为Perl的替代品? 另外,较新版本的Perl真的会给Perl社区带来很大的改善,或者使Perl与其他语言相比重回舞台吗? 编辑: 好的,我想这是一个更好的,改写的问题: Perl还在增长,还是“垂死”?它仍然是值得学习和使用的语言吗?与其他语言相比,它真正使“发光”哪些项目?是什么使Perl成为选择的语言?本质上:与其他语言相比,Perl是否已经过时了?如果是,您期望这种情况会改变还是继续? 谢谢所有到目前为止回答的人,讨论非常有趣!
77 perl 

30
您曾经必须遵循的最糟糕的编码标准?[关闭]
您是否曾经努力过编码以下标准: 大大降低了您的生产率? 最初是出于充分的理由被包括在内,但在最初的关注变得无关紧要之后被保留了很长时间? 列表中的时间很长,以至于不可能全部记住它们? 您是否认为作者只是想留下自己的印记而不是鼓励良好的编码习惯? 您不知道为什么将它们包括在内? 如果是这样,您最不喜欢的规则是什么?为什么? 这里的一些例子

13
为什么Java没有更广泛地用于游戏开发?[关闭]
我不是游戏开发者,也不是任何人,但是我知道Java在游戏开发中的使用并不广泛。Java对于大多数游戏来说应该足够快,所以要抓住什么呢?我可以想到一些原因: 缺乏具有Java专业知识的游戏开发人员 缺乏良好的游戏开发框架 程序员不想接受Java作为游戏编程语言。大多数人只接受C ++吗? 不支持游戏机(尽管PC市场仍然存在) 当然可以是其他东西。谁能比我更好地了解这个业务,可以解释一下为什么Java在游戏开发方面没有发展势头吗?

4
代码审查的目的是什么
我正在尝试以代码审查的价值出售我的组织。我曾在几个地方工作过。我已经看到它们用来确定样式选择和功能决策,并且我所看到的只是用于确保没有危险实现的直觉检查。我的直觉是,最有效的目的是在这两种选择之间。 那么,代码审查的目的是什么?

9
如何用布尔清除器拨打电话?布尔陷阱
如@ benjamin-gruenbaum在评论中所指出的,这称为布尔陷阱: 说我有一个这样的功能 UpdateRow(var item, bool externalCall); 在我的控制器中,该值externalCall始终为TRUE。调用此函数的最佳方法是什么?我通常写 UpdateRow(item, true); 但是我问自己,我是否应该声明一个布尔值,以表明“真”值代表什么?您可以通过查看函数的声明来知道这一点,但是如果您看到类似以下内容,显然会更快,更清晰 bool externalCall = true; UpdateRow(item, externalCall); PD:不确定这个问题是否真的适合这里,如果不合适,我在哪里可以得到更多有关此的信息? PD2:我没有标记任何语言,因为我认为这是一个非常普遍的问题。无论如何,我使用c#,并且可接受的答案适用于c#
76 boolean  const 

16
我们应该设计程序来随机杀死自己吗?[关闭]
简而言之,为了整个系统的利益,我们是否应该将死亡设计在较低的程序,进程和线程中? 失败发生。进程死亡。我们计划灾难,并偶尔从灾难中恢复。但是我们很少设计和实现无法预测的程序终止。我们希望我们的服务正常运行时间只要我们愿意保持它们正常运行即可。 Netflix的Chaos Monkey是该概念的一个宏观示例,它在某些情况下会随机终止AWS实例。他们声称这有助于他们发现问题并构建更多的冗余系统。 我在说的是较低的水平。这个想法是让传统上长时间运行的进程随机退出。这将迫使冗余进入设计并最终产生更具弹性的系统。 这个概念已经有名字了吗?它已经在行业中使用了吗? 编辑 根据评论和答案,恐怕我不清楚我的问题。为了清楚起见: 是的,我的意思是随机的, 是的,我的意思是在生产中,并且 不,不仅用于测试。 解释一下,我想比喻多细胞生物。 在自然界中,生物由许多细胞组成。这些单元自行分叉以创建冗余,然后最终死亡。但是,应始终有足够种类的正确细胞供生物体发挥功能。这种高度冗余的系统还有助于在受伤时进行康复。细胞死亡,生物体得以生存。 将随机死亡纳入程序中将迫使更大的系统采用冗余策略以保持生存。这些相同的策略是否可以在遇到其他无法预测的故障时使系统保持稳定? 而且,如果有人尝试过这种方法,那叫什么呢?如果它已经存在,我想了解更多。
76 design 


15
开发人员是否应将错误输入错误跟踪系统?
在开发(功能或错误修复)时,有时我会偶然发现与我正在研究的内容不直接相关的错误。在那种情况下我该怎么办。修好吗?试着记得以后再修复它吗?写下来吗?还是将其输入错误跟踪系统? 我通常将其输入到Bug跟踪系统中,然后让过程进行自我显示(例如,分类,分配等)。但是,我几乎从未见过其他开发人员输入错误。(这是为什么?)

14
应该优先考虑什么:YAGNI或Good Design?
在什么时候,YAGNI应该优先于良好的编码习惯,反之亦然?我正在研究一个正在工作的项目,并希望向我的同事缓慢介绍良好的代码标准(目前还没有,并且一切都只是某种形式而没有韵律或理由),但是在创建了一系列类之后(我们不要做TDD,或者根本不进行任何类型的单元测试。)我退后一步认为这违反了YAGNI,因为我非常确定地知道我们不需要扩展其中的某些类。 这是我意思的一个具体示例:我有一个数据访问层,其中包装了一组存储过程,该过程使用具有基本CRUD功能的基本存储库样式模式。由于所有存储库类都需要几种方法,因此我为存储库创建了一个通用接口,称为IRepository。但是,然后我为每种类型的存储库(例如ICustomerRepository)创建了一个“标记”接口(即,没有添加任何新功能的接口),具体类实现了该接口。我已经通过Factory实现完成了同样的事情,以便从存储过程返回的DataReaders / DataSets中构建业务对象。我的存储库类的签名通常看起来像这样: public class CustomerRepository : ICustomerRepository { ICustomerFactory factory = null; public CustomerRepository() : this(new CustomerFactory() { } public CustomerRepository(ICustomerFactory factory) { this.factory = factory; } public Customer Find(int customerID) { // data access stuff here return factory.Build(ds.Tables[0].Rows[0]); } } 我在这里担心的是,我违反了YAGNI,因为我有99%的确定性知道,除了CustomerFactory向该存储库提供具体内容外,没有其他理由。因为我们没有单元测试,所以我不需要任何MockCustomerFactory类似的东西,并且拥有如此多的界面可能会使我的同事感到困惑。另一方面,使用工厂的具体实现方式似乎具有设计异味。 在适当的软件设计与不过度设计解决方案之间是否有折衷的好方法?我在问我是否需要所有“单一实现接口”,或者是否可以牺牲一些好的设计,而仅拥有例如基本接口和单个具体的接口,而不用担心对该接口进行编程接口(如果实现的话)将被使用。

8
C#中“ yield”关键字的实际使用
经过将近4年的经验,我还没有看到使用yield关键字的代码。有人可以告诉我该关键字的实际用法(以及解释)吗?如果可以,是否还有其他方法可以更轻松地实现它的功能?
76 c#  syntax 

5
是Python解释还是编译?
这只是我在阅读有关解释和编译语言时的一个奇迹。 Ruby无疑是一种解释型语言,因为源代码在执行时由解释器处理。 相反,C是一种编译语言,因为必须先根据机器编译源代码,然后再执行。这样可以更快地执行。 现在开始使用Python: 导入时,Python代码(somefile.py)在同一目录中创建文件(somefile.pyc)。让我们说导入是在python shell或django模块中完成的。导入后,我稍稍更改了代码,然后再次执行导入的功能,以发现它仍在运行旧代码。这表明* .pyc文件是类似于编译C文件后创建的可执行文件的已编译python文件,尽管我无法直接执行* .pyc文件。 当直接执行python文件(somefile.py)(./somefile.py或python somefile.py)时,不会创建.pyc文件,并且按指示解释行为的方式执行代码。 这些建议每次在新过程中导入python代码时都会编译python代码,以创建.pyc,而直接执行时会对其进行解释。 那么我应该将其视为哪种类型的语言?解释还是编译?以及它的效率与解释和编译语言相比如何? 根据Wiki的“ 解释语言”页面,它被列为编译为虚拟机代码的语言,这是什么意思?

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.