软件工程

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


5
是否应该始终完全封装内部数据结构?
请考虑此类: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThings(){ return things; } } 此类将用于存储数据的数组公开给任何感兴趣的客户端代码。 我是在正在开发的应用中完成此操作的。我有一个ChordProgression存储序列Chords的类(并执行其他一些操作)。它有一个Chord[] getChords()返回和弦数组的方法。当必须更改数据结构(从数组更改为ArrayList)时,所有客户端代码都将中断。 这让我思考-也许以下方法更好: class ClassA{ private Thing[] things; // stores data // stuff omitted public Thing[] getThing(int index){ return things[index]; } public int getDataSize(){ return things.length; } public void setThing(int …

4
作为程序员,您离开公司后在专业上有义务提供持续的支持吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 6年前关闭。 过去,我曾做过一些编程工作,当时我是唯一从事项目工作的开发人员。我离开后,通常每周会收到这些公司的几封电子邮件,通常是从那里代替我的开发商那里来的。这些电子邮件通常要求提供有关如何工作以及我最好如何基于现有系统实施功能x的详细信息。 我通常彬彬有礼且乐于助人,但这种沟通方式确实开始使我厌烦,因为每次工作都使脚踝周围的重量增加。更不用说他们是我出于一个很好的理由而选择抛弃的项目。 我的问题是,告诉他们我不再提供支持并且拒绝并回答询问,这在专业上是可以的吗? 注意 这些公司都没有向我支付任何类型的聘用金,而咨询通常是来自开发商而非管理人员的非正式问题。

1
如何在CQRS + Event Sourcing架构中处理Add / Create *命令
我想使用CQRS模式和Event Sourcing来实现我的第一个应用程序。我想知道如何正确处理聚合根的创建。假设有人发送CreateItem命令。应该如何处理?事件ItemCreated应该存储在哪里?作为新项目的第一事件?还是我应该具有某种ItemList实体来聚合所有项目,并且其事件列表仅由ItemCreated事件组成? 乌迪·达汉( Udi Dahan)建议不要创建聚合根,而应始终使用某种获取方法。但是我如何获取新的东西,当然还没有分配任何ID。我理解背后的想法,并且认为一个新对象是其状态由零个事件组成的对象是很合理的。但是我应该如何使用呢?我的存储库中应该有一个与众不同的方法吗?getNewItem()还是让我的get(id)方法接受Optional<ItemId>? 编辑:经过一段时间的挖掘,我发现使用actor对上述模式进行了非常有趣的实现。作者不是创建聚合,而是从某种具有新创建的UUID的存储库中检索聚合。这种方法的缺点是他允许出现临时的不一致状态。我也想知道如何delete使用这种方法来实现方法。只需将Deleted事件添加到聚合的事件列表中?

2
关于静态班级和成员的思想和最佳实践
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我对有关静态成员或整个静态类的想法和行业最佳实践感到很好奇。这有什么弊端,或者它参与任何反模式? 我将这些实体视为“实用程序类/成员”,从某种意义上说,它们不需要或不需要实例化该类来提供功能。 关于此的一般想法和行业最佳实践是什么? 请参阅下面的示例类和成员,以说明我所引用的内容。 // non-static class with static members // public class Class1 { // ... other non-static members ... public static string GetSomeString() { // do something } } // static class // public static class Class2 { // ... other static members ... public …
11 c#  class-design 

2
发布-订阅模式与gotos有何不同?
我的理解是,Goto语句通常不被接受。但是,发布-订阅模式在概念上似乎是相似的,因为一段代码发布一条消息时,它将执行单向控制转移。程序员可能不知道程序的哪些部分正在订阅此消息。 我在许多JavaScript程序中都看到了类似的东西,在这些程序中,事件用于方便地跨模块“跳跃”。我是否缺少有关发布-订阅或事件驱动模式的信息?

6
如何为多个“姓氏”建模?
在说西班牙语的国家/地区,我们使用多个姓氏,例如: 姓氏↙姓氏 Pedro ArturoRodríguezLoyola 中间名↗(?) 我正在尝试为患者姓名建模数据。在我们国家,这很重要,因此我不能忽略第二个名字,但我想构建一个对其他开发人员,尤其是英语国家的开发人员有意义的应用程序。 我在English.SE上创建了一个类似的问题,它对为什么坚持两个价值观很重要有一些见解。

5
Java的Boolean类-为什么不使用枚举?
在我看来,布尔类是作为枚举实现的理想候选者。 从源代码来看,大多数类都是静态方法,可以将其不变地移至枚举,其余的则变得像枚举一样简单。比较原始(删除注释和静态方法): public final class Boolean implements java.io.Serializable, Comparable<Boolean> { public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); private final boolean value; public Boolean(boolean value) { this.value = value; } public Boolean(String s) { this(toBoolean(s)); } public boolean booleanValue() { return value; …
11 java  api  source-code 

2
如何确定消息是命令消息还是事件消息?
两种企业集成模式是命令消息和事件消息。我正在开发一个系统,在该系统中,我们不仅使用消息传递与其他系统集成,还使用服务之间的内部通信。它应该是一个最终一致的系统,并且服务应该彼此一无所知(几个特殊用途的服务除外)。因此,我们尽量避免感觉像是远程过程调用(RPC或RPI)。我们有一个面向总线和面向消息的中间件系统,并且所有消息都被广播。 我们倾向于将消息命名为事件,即过去完美的短语,例如PurchaseOrderShipped。但是,通常仅在某些其他服务需要了解事件时才添加事件,并且一开始通常只关心一个服务。而且,有时该服务会发出一个结果,该事件会被第一个服务侦听。因此,如果我要绘制交互关系图,则它看起来更像是上面链接中的命令消息图(甚至是RPC图),而不是事件消息图,尽管这实际上并没有实现直接消息传递,但在公交车上广播。另外,我最近看到有一些消息被添加为命令,即命令中的短语,例如BillShippedPurchaseOrder。 奇怪的是,消息的名称及其传递方式不会通过将其命名为事件还是命令而改变。那么,如何确定某个东西应该是命令消息还是事件?这仅仅是语义和命名的区别,还是命令和事件消息之间的实际实现区别?既然我们所有的消息都是广播的,那是否意味着没有一个是真正的命令消息?

3
在不使用电子邮件服务器的情况下发送电子邮件
JavaMail通常使用电子邮件提供商的SMTP接口使用电子邮件服务器发送电子邮件。是否需要使用电子邮件服务器发送电子邮件? 我有一个可以发送电子邮件的网站,如果可以的话,我想直接从该网站的代码发送电子邮件,而无需使用电子邮件服务器。JavaMail FAQ指出需要电子邮件服务器。 有没有一种方法可以通过JavaMail或其他API使用电子邮件服务器而不发送电子邮件?
11 java  email 

2
为什么Apple只允许iOS上使用静态框架?
显然,Apple可以为iOS创建动态加载的库(称为框架),因为它们带有XCode(例如UIKit)。应用开发人员只能创建静态库,或者充其量只能诱使Xcode在实际加载静态库时认为它正在加载框架,这被称为创建假框架,某些拖放方便,但没有任何动态加载优势。 Apple拒绝应用程序开发人员使用动态框架的原因是什么?似乎相当容易使用外部库,因为开发人员不必依赖挑剔的链接器标志或开源库依赖链。 我看到一个常见的原因是安全性。那么,为什么Apple允许OSX而不是iOS允许它?那里的安全性不是吗? 编辑:自iOS 8起,这不再相关。Apple已添加对动态框架的支持。


3
看板:如何选择工作项大小
从看板开始,我不确定我的工作项目应该有多细。当您找到有关如何选择WIP的许多具体建议时,我阅读的大多数看板教程对工作项的大小(=板上的卡片)仍然含糊不清。 为了进行计划和估算,人们通常建议将商品的尺寸保持较小,例如2-16小时。看板也一样吗?从我的计划到董事会是否总是存在1:1的映射? 如果没有最佳实践或一般建议,哪些因素会影响我对工作项粒度的选择?
11 kanban 

2
在单个方法中有效地混合使用同步和异步方法?
好的,听起来很奇怪,但是代码非常简单,可以很好地说明情况。 public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role) { AssertNotDisposed(); var roles = await GetRolesForUser(user); roles.Roles = RemoveRoles(roles.Roles, role); await Run(TableOperation.Replace(roles)); } (我知道我在下面的摘要中说的有点像,但以上是实际生产代码中的一种实际方法,该代码实际上正在执行我在这里要问的事情,并且我实际上对您的实际审查很感兴趣相对于异步/等待模式的正确性。) 我现在使用async/ awaitmore越来越多地遇到这种模式。该模式由以下事件链组成: 等待初始呼叫,这会给我一些我需要处理的信息 同步处理该信息 等待最后的通话,以保存更新的工作 上面的代码块通常是我如何处理这些方法。我await是第一个电话,我必须这样做,因为它是异步的。接下来,我要做的工作是不受IO或资源限制的,因此不是异步的。最后,我保存了我的工作,这也是一个async电话,而不再是我的工作await。 但这是处理这种模式的最有效/正确的方法吗?在我看来,我可以跳过await上一个电话,但是如果失败了怎么办?我是否应该使用Task诸如ContinueWith将同步工作与原始调用链接在一起的方法?我现在只是不确定我是否正确处理了这一点。 给定示例中的代码,是否有更好的方法来处理此async / sync / async方法调用链?

2
TDD在协作开源项目中是否可行
假设我想启动一个开源项目,希望/期望有很多人提交补丁,什么也没做。采取严格的TDD方法是否可行?我可以/应该/希望协作者在提交补丁时编写质量测试吗? 我一直在考虑的一件事是为单个错误报告和功能请求编写测试套件,并要求所有修补程序/拉动请求都使测试通过,但是到那时看来,编写功能/错误修复似乎会更好我。 据我所知,大多数使用TDD(或至少编写测试)的主要开放源代码项目似乎大多是纯粹由个人或团队编写的,在其中很容易实施TDD等实践。

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.