软件工程

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

2
REST API中的警告不是严重错误
我有一个REST API,对于某些企业(例如DELETE,POST或PUT),我有一些验证规则可以返回错误。 现在,我需要一种新的错误类型,例如非严重错误,它应该以正常方式失败,但是如果发送了“禁止警告”标志,则应该执行该操作。可以问这样的用户:“您确定要更改此状态,您尚未完成” 问题:是否存在针对此类错误的最佳实践? 次要问题: 我可以使用这种行为的任何HTTP语义吗? 我仍然遵循REST的想法吗(对我来说,我看起来确实如此)-我保持它为无状态
9 rest  api 

2
将我们的代码分解为可重用的位之后,我们如何测试和部署?
我们从一个开发人员开始,然后是一个包含我们所有代码的svn存储库: ^/foo/trunk/module-a ^/foo/trunk/module-b ^/foo/trunk/module-b/submodule-b1 ^/foo/trunk/website1 (当时是一个很大的进步)。在这有了长足发展的机会之后,我们开始遇到循环依赖项,缓慢的测试套件以及重用代码的一般困难的问题(因为例如website1的功能集已潜入其他通用模块-a中)。 想要对代码库进行模块化,并希望我们不久就迁移到git(并且已经读过git不喜欢svn mega-repos的地方),我们已经过渡到了更精细的结构: ^/module-a/trunk/ ^/module-b/trunk/ ^/module-b/trunk/sumbmodule-b1 ^/earlier-sub-sub-sub-module-c/trunk etc. (about 120 such modules) 从概念上讲,这很棒。更多的模块化代码,更快的测试套件,更容易记录的文档,等等。我们开源了一些更通用的组件,并使所有模块都可以pip安装(pip install -e .用于将它们安装在developmentvirtualenv中)。 我们创建了一个^/srv/trunk存储库,其中包含运行时环境的文件夹结构。^/srv/trunk/lib用于模块,/srv/trunk/src用于的其余部分^/foo/trunk,^/srv/trunk/www用于网站等。 最后(从我很久以前与perforce合作的[ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html]中吸取灵感),我们创建了一个“ vcs-提取”文本文件,其中列出了所有相关的存储库以及应将其检出到开发环境中的位置,并提供了相应的命令来执行此操作。例如vcs-fetc行: svn srv/lib/module-a ^/module-a/trunk 会导致(第一次) cd /srv/lib && svn co ^/module-a/trunk module-a 或(之后) cd /srv/lib/module-a && svn up 同样适用于github repos(我们自己的和更改/未更改的供应商软件包)。 我们使用了相同的vcs-fetch流程来创建生产环境,但是我们很快发现,在进行vcs-fetch之后,我们无法知道哪个版本在prod中运行。 对于大型仓库,我们可以在从主干更新产品之前记下修订号,然后回去就很简单svn -r nnn up .了。使用svn和git中的代码(以及hg中的一个模块)以及〜120个仓库,如何执行此操作并不明显。 …

3
ASP.net 5和EF7中是否不再需要存储库?
我在github上向EF团队发布了一个问题。我得到了一个答复,说最好在这里提出这个问题,所以我将其复制并粘贴到此处作为链接,以便其他人可以在GitHub上看到一些答复。 问题:我正在做一些研究,有人指出DBContext类的第24行指出 DbContext是工作单元和存储库模式的组合。 这是否意味着我们不再需要将EF抽象到存储库,然后使用and Interface将其注入Controller中? Github上的原始帖子:https : //github.com/aspnet/EntityFramework/issues/4899 我问这个问题的原因是,我似乎进入了一个即时状态,即在存储库中添加了很多方法,例如GetById,GetByName,GetWithIncludesABC,GetWithIncludes123等。这似乎在困扰着我


2
为什么在Haskell中不绑定Enum的子类
似乎任何Bounded实例都应具有健全的Enum实现。我个人无法想到一个反例,尽管如果有人提出了一个非病态的例子,那么我会理解为什么不是这样。 从这:i两个类型类上看,似乎标准库中当前唯一的例外是元组,它们是有界的,但不是枚举。但是,任何绑定元组也必须以合理的方式可枚举,方法是简单地增加最后一个元素,然后在到达maxBound时环绕它。 此更改可能还涉及在Bounded中添加predB和/ nextB或类似的东西,以安全/循环的方式遍历Enum值。在这种情况下toEnum 0 :: (...)等于(toEnum 0, toEnum 0, ...) :: (...)


2
当观察者彼此不独立时,观察者模式是否合适?
我有一个class Car具有2个属性的属性:int price和boolean inStock。它还持有List的abstract class State(空类)。可以在汽车上应用两种状态,每种状态由其自己的类表示:class Upgrade extends State和class Shipping extends State。 A Car可以容纳2个状态中的任何一个。各州有以下规则: Upgrade:加到1汽车本身适用的每个州的价格上。 Shipping:如果Shipping列表中至少有1个状态,则将inStock其设置为false。 例如,以price = 1和开头inStock = true: add Shipping s1 --> price: 1, inStock: false add Upgrade g1 --> price: 1, inStock: false add Shipping s2 --> price: 2, inStock: false add Shipping s3 --> price: …

1
何时使用特质,而不是继承和组合?
关于OOP,有三种常见的方法AFAIK实现可重用性 继承:通常代表is-一种关系(鸭子is-鸟) 组成:通常代表有一个关系(汽车有一个引擎) 特性(例如PHP中的trait关键字):...对此不确定 虽然在我看来特质可以实现has-a和is-a关系,但我真的不确定它打算用于哪种建模。特征是针对哪种情况设计的?

8
在Scrum评估中讨价还价和失败的尝试是否合法?
我在Scrum会议中注意到,开发人员通常会对故事进行现实的估计。但是,即使是相当简单的故事,也需要大量的精力进行配置,设置第三方组件,测试和最终构建,并且系统积累了相当多的技术债务,因此对于产品所有者或管理层来说,估算值通常显得过高。 PO经常尝试降低此类估计,例如:“什么,您想要这个故事要13个故事点(4天),这不可能!我无法向管理层解释,有人应该可以对此进行编码3 SP [在4小时内!!”。结果,开发人员不得不屈服于做出5或8个故事点(1.5至2天)的估计值(Scrum估计值仍被视为承诺,而不仅仅是预测)。 当然,如果没有任何降低期望的计划(主要是在测试和质量方面),则这些冲刺经常会失败。开发人员的估算是诚实,现实的估算,击败估算并不会降低实际的工作量。 可以说:“您不应该做出不可能的承诺,只是因为有人逼着您去做!” 但是我认为,开发人员的工作是软件设计和编码,而不是讨价还价或承受压力!可能有各种各样的交易,通常是直接与外部客户打交道的交易,但这并不是大多数Office开发人员! 对我而言,这种做法只会使程序员看起来像个混蛋,会导致不断出现的sprint故障,并阻止了实际的估算,同时也寻求了实际的改进。 Scrum准则对此主题有何看法,或者他们对此有何表述? 编辑:用故事点代替时间。我指的是规划扑克和故事点的初始估算阶段,而不是任务详细计划。我只是把日期/时间放在这里,因为有时是典型的对话,有时是用时间而不是时间。抱歉给您带来任何混乱!故事点示例比时间示例代表更长的时间段。 编辑2当前没有专门的Scrum主持人,而PO在评估会议时扮演着这个角色。因此,可能是角色冲突使这种不适当的讨价还价变得更糟,因为他是作为权威而不是中立或开发者的混乱大师出现的。也许,只要没有候选人,就可以将他作为有偏见的参与者而不是“大师”来解决。

1
代码设计:委托任意函数
在PPCG上,我们经常遇到“山丘之王”挑战,这使不同的代码bot相互竞争。我们不希望将这些挑战限制为单一语言,因此我们通过标准I / O进行跨平台通信。 我的目标是编写一个框架,使挑战编写者可以使用它来简化编写这些挑战的过程。我想满足以下要求: 挑战编写者可以创建一个类,其中方法表示每种不同的通信。例如,在我们的《善与恶》挑战中,作者将创建一个Player具有abstract boolean vote(List<List<Boolean>> history)方法的类。 当调用上述方法时,控制器能够提供通过标准I / O进行通信的上述类的实例。也就是说,并非上述类的所有实例都必须通过标准I / O进行通信。其中的3个机器人可能是本机Java机器人(简单地覆盖了Player该类,另外2个机器人则使用另一种语言) 这些方法将不会总是具有相同数量的参数(也不会总是具有返回值) 我希望挑战编写者必须尽可能少地工作才能使用我的框架。 我不反对使用反射来解决这些问题。我考虑过要求挑战编写者做类似的事情: class PlayerComm extends Player { private Communicator communicator; public PlayerComm(Communicator communicator){ this.communicator = communicator; } @Override boolean vote(List<List<Boolean>> history){ return (Boolean)communicator.sendMessage(history); } } 但是如果有几种方法,这可能会很重复,而且持续进行强制转换并不有趣。(sendMessage在此示例中,将接受可变数量的Object参数,并返回Object) 有一个更好的方法吗?

3
使用依赖项注入时,在一类中可以接受多少次注入
我正在C#中使用Unity进行依赖项注入,但是该问题应该适用于使用依赖项注入的任何语言和框架。 我试图遵循SOLID原理,因此得到了很多抽象。但是现在我想知道是否有一个最佳实践,一个班级应该注入多少次注入? 例如,我有一个包含9个注入的存储库。这对于其他开发人员来说很难理解吗? 注射具有以下职责: IDbContextFactory-为数据库创建上下文。 IMapper-从实体到领域模型的映射。 IClock-摘要DateTime.Now以帮助进行单元测试。 IPerformanceFactory-测量特定方法的执行时间。 ILog-用于记录的Log4net。 ICollectionWrapperFactory-创建集合(扩展IEnumerable)。 IQueryFilterFactory-基于将查询数据库的输入生成查询。 IIdentityHelper-检索登录的用户。 IFaultFactory-创建不同的FaultException(我使用WCF)。 我对如何委派职责并不感到失望,但是我开始对可读性感到担心。 所以,我的问题是: 一个班应该进行多少次注射是否有限制?如果是这样,如何避免呢? 多次注入会限制可读性,还是实际上会提高可读性?

2
为什么每一个都有冒号而不是“中”?
从Java 5语言指南: 当您看到冒号(:)时,将其读为“ in”。 那么为什么不in首先使用呢? 多年来一直困扰着我。因为它与其他语言不一致。例如,在Java有implements,extends,super对于类型,而不是符号之间的关系类似于C ++,Scala的或Ruby。 在Java中,冒号在5个上下文中使用。其中三个继承自C。另外两个则由Joshua Bloch认可。至少,那是他在“关闭争议”演讲中说的。当他批评冒号的映射与for-each语义不一致时,就会出现这种情况。在我看来,这很奇怪,因为这是每个人滥用的预期模式。喜欢list_name/category: elements或laberl/term: meaning。 我已经窥探了jcp和jsr,但是没有发现邮件列表的迹象。谷歌未对此事进行任何讨论。只有新手对冒号的含义感到困惑for。 in迄今为止提供的主要反对意见: 需要新的关键字;和 使词汇复杂化。 让我们看一下相关的语法定义: 声明 :'for''(('forControl')'语句 | ... ; forControl :EnhancedForControl | forInit?';' 表达?';' forUpdate? ; EnhancedForControl :variableModifier *类型variableDeclaratorId':'表达式 ; 从更改:为in不会带来额外的复杂性或需要新的关键字。
9 java 

4
如何确定源代码管理中是否有有用的已删除代码?
因此,我正在阅读此问题,是否应该删除未引用的代码? 一些建议是删除未引用的代码,因为该代码在源代码控制中以供将来参考。 您如何组织此删除的代码,以便您(或其他程序员)的更高版本以后可以找到它?您是否制作了一个单独的分支或以某种方式在源代码管理中对其进行了标记? 以前我从未从源代码控制中恢复已删除的代码,我只是将其用于跟踪仍在运行的代码的更改。在包含其他人的实验性工作之前,我已经引用过分支,所以也许这是标记在主干中删除的有趣代码段的好方法吗?

3
从另一个函数获取值的函数是否被视为纯函数?
我试图找出一种在没有副作用的情况下处理默认变量值的方法,并且最终得到以下结果: function getDefaultSeparator() { return ':'; } function process(input, separator) { var separator = separator || getDefaultSeparator(); // Use separator in some logic return output; } 默认分隔符将在其他函数中使用,我只想在一个地方定义它。 如果这是一个纯函数,那么与仅使用全局DEFAULT_SEPARATOR常量有什么区别?

1
不基于数组的计算机体系结构
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 瓦德勒(Wadler)撰写的有关函数式编程Monad(Haskell)的原始论文 历史悠久的另一个问题是,是否需要使程序基于数组更新。由于在基于数组的算法和体系结构开发方面投入了大量精力,因此我们将回避这一辩论,并简单地假设答案是肯定的。 没有引用或暗示其他可能的体系结构。我听说过一些适合Lisp的体系结构。有人可以指导我一些关于如何/如何开始该主题的解释和指导。非常感谢您可以简要介绍不同的体系结构。

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.