软件工程

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

1
在MVP模式中,View应该基于UI内容实例化Model对象,还是仅将这些内容作为参数传递给Presenter?
我正在开发的Android应用程序中使用MVP模式。 我基本上有4个元素: 可以在其中添加新用户的AddUserView: AddUserPresenter UserInfo(pojo) UserInfoManager(业务逻辑和存储管理器) 我的问题是: 当我在AddUserView中按下“添加”按钮时,它应该获取文本视图的内容,实例化一个新的UserInfo并将其传递给Presenter。还是AddUserView应该只获取textViews内容并将其传递给AddUserPresenter,而后者实际上将实例化UserInfo并将其传递给UserInfoManager?

1
银行实际上将什么用作货币数据类型?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我知道一些不错的选择: 大整数(例如int64_t,mpz_t,任何bignum lib)代表美分或10 -n美分-例如,整数代表1分钱的1分钱(1.05美元== 10500)。这称为缩放整数。 用于任意精度十进制算术的高级库,例如Java中的BigDecimal,Python中的Decimal,Javascript中的decimal.js,C ++中的boost :: multiprecision 字符串。 打包的BCD(二进制编码的十进制)是一种更加神秘的方法,在旧软件中似乎很流行。了解 更多 关于它。 在银行(或信用卡,ATM,POS系统)的生产代码中,实际使用最多的数据类型是什么?我特别要问那些为银行工作的人。 编辑:对于那些具有相同问题域的超级有用的链接(需要实现不中断的“金钱”数据结构)。 http://martinfowler.com/eaaDev/quantity.html http://www.codeproject.com/Articles/28244/A-Money-type-for-the-CLR http://c2.com/cgi/wiki?MoneyObject http://www.setfiremedia.com/blog/7-top-tips-for-coding-with-currency http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 编辑说这是一个重复问题的同伴:这是一个实际的问题,而不是“什么是最好的”的理论问题。阅读我问题的未编辑标题。我问的是人们在银行的代码库中亲眼目睹了什么。 我知道BigDecimal显然是“最佳”的,但是类似的漂亮API并非随处可见,不管您信不信,并且十进制库相对于int而言昂贵。

2
与离线系统同步
我正在设计一个系统,通过该系统,我将同步移动设备(具有嵌入式应用程序)中的业务数据,该数据会生成数据并将其发送回服务器。同步的每一行都会在数据库中生成特定的业务日志。 如果我同步的数据生成的日期(在同步数据内)晚于我的业务数据的最后修改日期,则我必须忽略它,而只需在数据库中添加日志即可。处理上载的数据后,将从数据库中获取数据并将其下载到设备。 由于写完后立即下载,同步必须是同步的。如果像这样的东西足以取代我现有的解决方案,那么仍然有可能采用读写器模式。更重要的是能够下载最新数据。该数据是整体获取的,目前没有实现差异(它可能会在以后出现,但这不会成为问题)。 我可能在同一个业务对象上运行多个同步,这不太可能,但是可能会发生,我希望能够处理它。除非使用嵌入式移动应用程序几天不重新同步,否则预计同步将持续几秒钟但不会持续几分钟。 同步处理的数据量预计不会很大。 因此,我最终在我的同步方法上使用了互斥,更确切地说,我正在使用Java,并且在写入方法上放置了同步,而不是整个同步过程都放在不阻止只读同步的位置。 我想知道 : 这样是否有意义?只要同步过程的数量和时间仍然可以接受。 一般来说,我应该看什么概念。奖励:Spring模块中是否有这些概念的实现。

2
逐渐将代码库移至依赖项注入容器
我有一个很大的代码库,其中包含许多“反模式”单例,带有静态方法的实用程序类以及使用new关键字创建自己的依赖项的类。这使得代码很难测试。 我想逐步将代码迁移到依赖项注入容器(在我的情况下是Guice,因为它是一个GWT项目)。从我对依赖注入的理解来看,它全有还是全无。所有类都由Spring / Guice管理,或者没有。由于代码库很大,因此我无法在一夜之间转换代码。所以我需要一种逐渐做到的方法。 问题是,当我从一个需要注入其他类的类开始时,我不能@Inject在那些类中使用简单的类,因为那些类尚未由容器管理。因此,这将创建一条长链,直至未注入任何地方的“顶级”类。 我看到的唯一方法是Injector暂时使/应用程序上下文通过单例全局可用,以便其他类可以从中获取托管bean。但这与不composition root向应用程序公开的重要思想相矛盾。 另一种方法是自下而上:从“高级”类开始,将它们包含在依赖项注入容器中,然后慢慢移至“较小”类。但是然后我不得不等待很长时间,因为我可以测试仍然依赖于全局变量/静态变量的较小的类。 实现这种逐步迁移的方式是什么? PS问题:依赖注入的渐进方法在标题上相似,但是它不能回答我的问题。

4
如何反对业务对象类设计的这种“完全公开”的思维方式
我们做了很多的单元测试,我们的业务对象的重构,而我似乎有很对类设计比其他同龄人不同的意见。 我不喜欢的示例类: public class Foo { private string field1; private string field2; private string field3; private string field4; private string field5; public Foo() { } public Foo(string in1, string in2) { field1 = in1; field2 = in2; } public Foo(string in1, string in2, string in3, string in4) { field1 = …

3
如何处理具有相同名称的类(不同的包)
我和我的研发团队维护着庞大的代码库。我们已经将业务逻辑分为多个包。其中一些具有相同名称的类。 如您所料,当在同一Java文件中引用两个类时,名称冲突。 例如: com.myapp.model (package) - Device (class) - ... com.myapp.data (package) - Device (class) - ... 我们就治疗这些病例的最佳实践进行了辩论,并提出了以下选择: 第一种选择 重命名类,添加前缀 ModelDevice DataDevice 第二选择 同时引用包和类的完整名称 com.myapp.model.Device com.myapp.data.Device 在代码管理和可伸缩性方面,更正确的是什么? 我们目前正在混合使用这两种方法,并开始出现不一致之处

7
为什么没有更多的自然语言编程语言?
是否有可用且可扩展的编程语言不止一种自然语言? 例如,带do..while循环的英语版本,带循环的西班牙语版本,带hacer..mientas的法语版本faire..pendant和带的荷兰语版本doe..terwijl。 我可以想到的唯一一种“编程语言”就是Microsoft VBA。 奖励问题:为什么很少有多种语言的编程语言?

2
Vector <float> .Equals应该是自反的还是应该遵循IEEE 754语义?
比较浮点值是否相等时,有两种不同的方法: NaN不等于自身,这符合IEEE 754规范。 NaN等于自身,这提供了自反性的数学属性,这对于定义等价关系至关重要 在C#(内置的IEEE浮点类型float和double)遵循IEEE语义==和!=(和关系运算符一样&lt;),但确保反思object.Equals,IEquatable&lt;T&gt;.Equals(和CompareTo)。 现在考虑一个在float/ 之上提供矢量结构的库double。这样的向量类型将重载==/ !=并覆盖object.Equals/ IEquatable&lt;T&gt;.Equals。 大家都同意==/ !=应该遵循IEEE语义。问题是,这样的库是否应该以Equals自反的方式或与IEEE语义相匹配的方式来实现该方法(与相等运算符分开)。 将IEEE语义用于Equals以下方面的参数: 遵循IEEE 754 (可能更快),因为它可以利用SIMD指令 我已经在stackoverflow上问了一个独立的问题,关于如何使用SIMD指令表达自反式相等性及其性能影响:用于浮点相等性比较的SIMD指令 更新:似乎可以使用三个SIMD指令有效地实现自反性相等。 Equals涉及浮点的文档不需要反射: 对于Equals(Object)方法的所有实现,以下语句必须为true。在列表中x,y和z代表对象引用不为空。 x.Equals(x)返回true,除非涉及浮点类型。参见ISO / IEC / IEEE 60559:2011,信息技术-微处理器系统-浮点运算。 如果您将浮点数用作字典键,那么您将生活在一种罪过的状态中,不应期望表现出理智的行为。 自反的观点: 这是与现有的类型,包括一致的Single,Double,Tuple和System.Numerics.Complex。 我不知道BCL中Equals遵循IEEE而不是反身的任何先例。相反的例子包括Single,Double,Tuple和System.Numerics.Complex。 Equals主要用于依赖自反性的容器和搜索算法。对于这些算法,如果阻止它们工作,则性能提升是无关紧要的。不要牺牲性能的正确性。 它打破了所有基于散列集和词典,Contains,Find,IndexOf各种收藏品/ LINQ,一套基于LINQ操作(Union,Except,等),如果数据中包含NaN的值。 在IEEE语义可接受的情况下执行实际计算的代码通常适用于具体类型并使用==/ !=(或更可能是epsilon比较)。 您目前无法使用泛型编写高性能的计算,因为您需要为此进行算术运算,但是这些不能通过接口/虚拟方法使用。 因此,较慢的Equals方法不会影响大多数高性能代码。 对于需要IEEE语义或需要提高性能的情况,可以提供一种IeeeEquals方法或一种方法IeeeEqualityComparer&lt;T&gt;。 我认为这些论点强烈支持反身执行。 微软的CoreFX团队计划在.NET中引入这种向量类型。与我不同,他们更喜欢IEEE解决方案,主要是因为性能方面的优势。由于这样的决定在最终发布后肯定不会改变,因此我想从社区中获得我认为是一个大错误的反馈。

2
如何管理来自BSD许可项目的贡献者的版权声明
该LICENSE文件中包含以下BSD许可证: Copyright (c) 2006-2016 SymPy Development Team All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: a. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. …

3
C的“真实”变量大小有用吗?
一直以来,我一直将C的积极特性(实际上是它的实现,如gcc,clang等)打动我的一件事是,它在运行时不会在您自己的变量旁边存储任何隐藏信息。我的意思是,例如,如果您想要类型为“ uint16_t”的变量“ x”,则可以确定“ x”将仅占用2个字节的空间(并且不会携带任何隐藏信息,例如其类型等) )。同样,如果要使用100个整数的数组,则可以确保它与100个整数一样大。 但是,我越想为此功能提出具体的用例,就越想知道它实际上是否具有任何实际优势。到目前为止,我唯一能想到的就是它显然需要更少的RAM。对于有限的环境(例如AVR芯片等),这无疑是一个巨大的优势,但是对于日常的台式机/服务器用例而言,这似乎无关紧要。我正在考虑的另一种可能性是,它对于访问硬件或映射内存区域(例如,用于VGA输出等)可能很有用/至关重要。 我的问题:没有此功能,是否有任何具体的领域无法实现或只能非常繁琐地实现? 附言:请告诉我您是否有更好的名字!;)

5
声明一个volatile变量是什么意思?
许多低级程序使用volatile关键字来进行内存映射的类型等,但是我对其在后台真正执行操作感到困惑。换句话说,当编译器没有“优化”内存地址时,这意味着什么?
9 c++  c  low-level 

2
编程到面向数据的接口
我们的代码库的一部分以以下样式编写: // IScheduledTask.cs public interface IScheduledTask { string TaskName { get; set; } int TaskPriority { get; set; } List&lt;IScheduledTask&gt; Subtasks { get; set; } // ... several more properties in this vein } // ScheduledTaskImpl.cs public class ScheduledTaskImpl : IScheduledTask { public string TaskName { get; set; } public …

1
出于设计原因,与Ruby或Smalltalk相比,Python的连接似乎不关注连接的项目,而是关注符号。
我认为OOP的基础之一是,我们有对象,这是我们有兴趣处理的项目,然后我们向它们发送消息。 因此,看起来很自然,我有一组项目,并且需要将它们放入一个字符串中,因此可以这样做: ["x", "o", "o"].join(" | ") # joining a tic-tac-toe row in Ruby (Smalltalk的操作方式与此相同)。" | "在某种程度上,它被认为是一个参数,是如何加入的一个象征。它可以是" "也一样,如果游戏板是要简单。因此,联接元素" | "并不是我们特别感兴趣的东西,也不是程序中的主要对象具有特别的重要性或意义。 如果Python使用 " | ".join(["x", "o", "o"]) 确实感觉有点奇怪,几乎感觉就像我们在向论点传递消息,以告诉论点某些事情。也许Python更具程序性?告诉连接字符串为我们执行一些职责? 是否保存实现,以便我们不必join为每个集合类定义一个?但是我们是否也可以为任何集合类编写一次(例如在Ruby中)不是真的吗? module Enumerable def my_join(joiner) self.inject {|a,b| a.to_s + joiner + b.to_s} end end (类似这样,调用to_s每个项目,依靠to_s每个类的做自己的事情,转换为字符串,然后将它们串联)。因此,我们不必为String,Hash或Set或我们拥有的任何集合类中的每一个实现。 还是Python出局不走OOP路线?它采用len("abc")和type([])替代"abc".len()或者[].type()甚至在Python3也似乎。Python是出于设计原因这样做吗?

2
接口隔离原理:如果接口存在大量重叠该怎么办?
摘自敏捷软件开发,原理,模式和实践:Pearson新国际版: 有时,由不同客户端组调用的方法会重叠。如果重叠很小,则组的接口应保持分离。公用功能应在所有重叠的接口中声明。服务器类将从每个接口继承通用功能,但仅实现一次。 鲍伯叔叔,谈论有微小重叠的情况。 如果出现大量重叠该怎么办? 说我们有 Class UiInterface1; Class UiInterface2; Class UiInterface3; Class UiIterface : public UiInterface1, public UiInterface2, public UiInterface3{}; 如果UiInterface1和之间有大量重叠,该UiInterface2怎么办?

1
如何将命令对象与正确的接收者关联?
我尝试使用命令模式在项目中实现撤消和重做 public abstract class Command { protected Form Receiver { set; get; } protected HtmlElement Element { set; get; } abstract public void ReDo(); abstract public void UnDo(); public Command(Form receiver) { this.Receiver = receiver; } } class AddElementCmd : Command { public AddElementCmd(HtmlElement elem, Form receiver) : base(receiver) { …

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.