软件工程

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

4
在构建产品创意之前,我该如何有效地对其进行测试?
我已经阅读了许多在线资源,但是想知道是否有更好的方法可以在花费无数周的时间来构建产品之前测试产品的创意? 我已经读过类似Validate.tech之类的东西,它们可以在一天内测试产品创意,但是用目标网页吸引用户而不是其他任何东西似乎是错误的。 我知道这有点抽象,但是很想听听您的想法。
11 product 

2
如果有两种处理任务的方法,应该如何选择呢?
我有一个特定的用例,并发现了在Internet上进行三种方法的定义,这些方法是针对模糊的用例定义的。我盯着这三个要应用的问题。 我倾向于坐在那里,不知道该怎么做-然后什么也不做...是否有选择的好方法?我应该尝试所有这些吗? 为了在某​​些情况下更具体,我正在尝试制作一个非常轻巧的棋盘游戏,在其中我需要屏幕的一部分,可以旋转棋盘游戏网格,放大到网格并在该网格上移动棋子。我不知道如何执行此操作,但是我在网上找到了诸如Core Animation,Core Graphics,Sprite Kit之类的东西,并且看到了支持和反对它们的理由-例如Sprite kit是高级别的,但是将帧频保持在60,当屏幕上没有任何实际动静时,会浪费电池。Core Animation是一个较低级别的API,它反对Apple提出的“采用最高级别的抽象”的指导。我不想学习3件事。1.有没有办法我可以选择并摆脱困境? 我故意将此问题保留为一个模糊的问题,因为我认为它适用于整个软件领域。

1
如何将MVC模式应用于C#WinForms应用程序?
我是一名C ++开发人员,此后一直使用MVC模式来设计GUI。 最近,我想重新使用C#,并设置了Windows Forms应用程序,但现在我对如何将其推送到MVC兼容结构有些迷惑。 我当前要执行的操作是“声明”为WinForms提供的类作为视图,并在后台为Model和Controller添加类。但是,我不确定如何与事件交互,例如单击按钮。通常,我会将这些事件重定向到控制器,并在完成后对View执行操作。 但是,这对于这个星座来说是非常不满意的。例如,如果我想实现“退出”按钮,则必须将事件从View重定向到Controller,并在View中实现一个额外的公共方法,然后可以从Controller调用它,而我可以在第一个实例中简单地从View调用Close()。 您对我有什么建议吗?我对C#中的Windows窗体的理解还不够好,无法尝试MVC实现吗?我给表格课一个错误的角色吗?对于这个用例,MVC仅仅是不合适的体系结构吗?
11 c#  mvc  winforms 

2
我们真的可以在OOP中使用不变性而不丢失所有关键的OOP功能吗?
我看到了使程序中的对象不变的好处。当我真正地为自己的应用程序考虑一个好的设计时,我常常自然而然地想到我的许多对象都是不可变的。我常常想让所有对象保持不变。 这个问题涉及相同的想法,但没有答案表明什么是不变性的好方法以及何时实际使用它。是否有一些好的不变设计模式?总体思路似乎是“使对象不可变,除非您绝对需要更改它们”,这在实践中毫无用处。 我的经验是,不变性将我的代码越来越多地驱动到功能范式,并且这种发展总是会发生: 我开始需要持久性(在功能上)数据结构,例如列表,地图等。 使用交叉引用非常不方便(例如,树节点引用其子节点,而子节点引用其父节点),这使我根本不使用交叉引用,这又使我的数据结构和代码更具功能性。 继承不再有任何意义,我开始改用合成。 OOP的整个基本概念(如封装)开始瓦解,而我的对象开始看起来像函数。 在这一点上,我几乎不再使用OOP范例中的任何内容,而可以切换到纯函数式语言。因此,我的问题是:是否有一种一致的方法来进行良好的不可变OOP设计,或者总是总是这样,当您将不可变的想法发挥到最大潜力时,您总是最终会使用一种功能语言进行编程,而该语言不再需要OOP世界中的任何东西?是否有任何好的指导方针来决定哪些类应该是不可变的,哪些应该保持可变以确保OOP不会崩溃? 为了方便起见,我将提供一个示例。让我们拥有一个ChessBoard不可变棋子的不可变集合(扩展抽象类)Piece)。从OOP的角度来看,一块负责从板上的位置生成有效的移动。但是要生成移动,棋子需要引用其棋盘,而棋盘需要引用其棋盘。好了,有一些技巧可以根据您的OOP语言创建这些不可变的交叉引用,但是它们很难管理,最好不要用它来引用其董事会。但是由于不知道棋盘的状态,所以棋子无法产生移动。然后,片段变成仅包含片段类型及其位置的数据结构。然后,您可以使用多态函数来生成各种片段的移动。这在函数式编程中是完全可以实现的,但是如果没有运行时类型检查和其他不良的OOP惯例,在OOP中几乎是不可能的...然后,

3
为什么没有像现代Javascript实现那样对Python进行优化?
V8(Chrome),SpiderMonkey(Firefox)和Chakra(IE / Edge)等现代Javascript实现都具有JIT编译功能,并且还有许多其他优化措施可以提高性能。 Python为什么没有这些? 我一直在研究PyPy和IronPython,它们都声称可以提高速度。PyPy我不明白用Python(一种解释性语言)编​​写的Python实现会比C语言中的参考实现更快。IronPython,同样的想法,但我看不到.NET Framework如何提高速度。
11 python-3.x  jit 

6
在非OO中如何编程?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 在阅读有关OOP缺点的严厉文章以支持其他一些范例的过程中,我遇到了一个例子,我发现它没有太多的缺点。 我想对作者的论点持开放态度,尽管我从理论上可以理解他们的观点,但尤其是一个例子,我很难想象如何用FP语言更好地实现它。 来自:http : //www.smashcompany.com/technology/object-oriented-programming-is-an-expensive-disaster-which-must-end // Consider the case where “SimpleProductManager” is a child of // “ProductManager”: public class SimpleProductManager implements ProductManager { private List products; public List getProducts() { return products; } public void increasePrice(int percentage) { if (products != null) { for (Product product : …

6
您可以与初级程序员一起进行连续部署吗?
有一瞬间,您开始了解到,在微服务体系结构中,要等一周一次部署所有微服务以确保所有功能都能正常工作,要比严格执行api版本控制,编写大量自动文档更令人恐惧。测试(每个测试有点:单元和探索,集成),并在阶段测试通过提交后就自动将其部署到生产中。 现在,只要您记得编写测试,在提交之前测试您的更改,知道如何使用API​​版本控制,并且您不会将数据库删除在部署时执行的增量数据库更新脚本中,这似乎是个好主意。不是大问题,因为它应该在舞台上失败)。 但是,与初级程序员一起这样做是否可行?也许我将必须实现请求请求模式。这会使它不像连续部署(这是我的猜测)吗? 我希望这不是基于观点的,我可以指望您分享您的经验,谢谢。 请注意,我不是在问CI还是在持续交付。我们已经有了。我们现在正在尝试使其连续部署,这意味着在代码签入之后将其全部投入生产。

3
软件体系结构vs系统体系结构vs类图?
我对以下术语感到困惑: 软件架构 软件应用程序体系结构是定义满足所有技术和运营要求的结构化解决方案的过程,同时优化了诸如性能,安全性和可管理性之类的通用质量属性。它涉及基于各种因素的一系列决策,并且这些决策中的每一个都会对应用程序的质量,性能,可维护性和整体成功产生重大影响。(微软) 系统架构 系统体系结构是概念模型,用于定义系统的结构,行为和更多视图。1体系结构描述是对系统的形式化描述和表示,以支持有关系统结构和行为的推理的方式组织(Wiki) 类图 在软件工程中,统一建模语言(UML)中的类图是一种静态结构图,它通过显示系统的类,其属性,操作(或方法)以及对象之间的关系来描述系统的结构。(维基) 如果我阅读了这些描述,所有这些都描述了应用程序不同模块之间的交互。但是,这些之间有什么区别? 我认为/尝试比较这些术语: 类图不是系统体系结构的一种形式,因为上面的描述(structure, behavior, and more views of a system)暗示体系结构中不存在任何实现细节,而类图描述了实现,并且可能更倾向于设计而不是体系结构? 我认为系统架构是还包括外部交互(如数据库)的架构,而软件架构则专注于应用程序本身?

3
如何正确处理用于python中的单元测试的全局参数?
我们正在实现许多算法,这些算法通常具有许多共享的,众所周知的和与安全性相关的参数。 当前,我们仅使用一个包含所有参数和两个预定义全局对象的类: class PublicParams(object): p = q = 0 def __init__(self, p, q): self.p = p self.q = q # used for tests publicParams_test = PublicParams(15,7) # Some 2048 bit numbers for example publicParams_secure = PublicParams(128378947298374928374,128378947298374928374) 然后,算法将一个PublicParams对象作为默认为生产性的参数publicParams_secure def AlgoOne(n, publicParams = publicParams_secure): # do stuff with publicParams.p # ... AlgoTwo(x, …

6
混乱与稳定发展是否构成矛盾?
我是一个拥有5个团队的开发团队的成员,该团队共有大约40个开发人员。我们遵循Scrum方法,并进行了3周的冲刺。我们有一个持续集成设置(Jenkins),其构建流程需要几个小时(由于进行了广泛的自动化测试)。基本上,开发过程运行良好。 但是,我们观察到进入新的Sprint几天后,我们的构建通常会变得不稳定,并且会一直不稳定,直到Sprint结束“提交停止”为止。这样做的不利影响是,构建步骤步入了管道,尤其是UI- / Webtest 几天没有执行(因为仅在“绿色”构建时触发)。因此,新引入的错误通常仅在冲刺的后期才检测到。 每个提交都通过一组基本测试进行验证。验证后,更改将在代码检查(德语)后推送至主版本 基本单元测试每30分钟运行一次,持续时间少于10分钟 集成测试每2h运行一次,持续时间1h UI / Webtest在成功的集成测试中运行,持续时间数小时 取决于谁在冲刺期间负责构建稳定性(每个冲刺都要移交责任),可能会有中间的临时“提交停止”以使构建恢复稳定。 因此,我们想要: 我们的开发团队可以在不受阻碍的冲刺期间开发和提交更改 如果构建步骤失败,我们将放弃构建过程,因为后续的构建结果意义不大 我们的构建过程可为开发人员及时提供质量反馈 给定(2),点(1)和(3)似乎相互矛盾。有没有人有一个很好的做法来应对这个问题? (我们目前正在松开要点(2),即使在失败的构建步骤中也允许继续构建。我还没有任何反馈意见,这如何影响我们的质量) 谢谢西蒙

1
REST服务作为2000多个客户端计算机的应用程序服务器。这是个好主意吗?
我们将使用javaFx中的UI构建一个系统,该用户界面将部署到2000台以上的计算机(最低数量为2000,但将会更多-可以达到5000台计算机)。 由于其他原因/限制,必须将其安装在计算机上,因此我们无法使用Web浏览器界面进行操作。 2000多台计算机将位于不同的地理位置组。通常,连接是好的,但在更偏远的位置可能不是很好。 我正在考虑使用Spring + Spring Boot + Spring Data(java)构建REST服务集群,而不是直接访问数据库。 REST服务将接受并返回Json。 我认为这是个好主意,因为: 该服务将充当数据库连接池(我认为数据库上的2000多个连接会引起问题); 可能有一个将日志传送到其他只读数据库的数据库来服务某些查询; 随着我们可以添加更多机器来运行REST服务,它将更好地扩展; 出于安全性和带宽节省的原因,可以在压缩中使用HTTPS。 无需重新部署2000多台计算机,就可以对业务实体进行一些集中式更改。 它与其他系统更好地集成(只需将其指向REST服务)。 这真的是个好主意吗? 您可以分享一些正面或负面的经验吗? 谢谢。
11 java  design  rest  spring 

4
我应该先构建一个功能齐全的应用程序,还是一个简单的应用程序,然后慢慢添加功能?
我在一家制造工厂工作,该工厂负责IT部门创建车间调度程序(非常需要)。根据其他经验,最好花更少的时间来构建可用的基本框架,然后在基础上通过添加功能或通过立即创建完全实现的解决方案来开始构建。我只从事开发工作大约一年,对于最初创建这种大小的应用程序没有太多经验。我一直倾向于这样一种想法:准系统应用程序是第一种应运而生的方法,这是由于对某种类型的数字时间表的极端需求,但我担心在事实之后添加随机功能可能会有些混乱。如果您处在相同的情况下,您会选择哪条路?

4
如何在C#中的接口中指定前提条件(LSP)?
假设我们有以下界面- interface IDatabase { string ConnectionString{get;set;} void ExecuteNoQuery(string sql); void ExecuteNoQuery(string[] sql); //Various other methods all requiring ConnectionString to be set } 前提条件是必须先设置/初始化ConnectionString,然后才能运行任何方法。 如果IDatabase是抽象类或具体类,则可以通过构造函数传递connectionString来某种程度地达到此前提条件- abstract class Database { public string ConnectionString{get;set;} public Database(string connectionString){ ConnectionString = connectionString;} public void ExecuteNoQuery(string sql); public void ExecuteNoQuery(string[] sql); //Various other methods all requiring …

3
如何执行输入验证而没有异常或冗余
当我尝试为特定程序创建接口时,通常是在尝试避免引发依赖于未经验证的输入的异常。 因此,经常发生的事情是我想到了这样的一段代码(出于示例目的,这只是一个示例,不要介意它执行的功能,例如Java): public static String padToEvenOriginal(int evenSize, String string) { if (evenSize % 2 == 1) { throw new IllegalArgumentException("evenSize argument is not even"); } if (string.length() >= evenSize) { return string; } StringBuilder sb = new StringBuilder(evenSize); sb.append(string); for (int i = string.length(); i < evenSize; i++) { sb.append(' …

2
没有DDD和没有(或带有?)ES的CQRS-什么是写模型,什么是读模型?
据我了解,CQRS背后的主要思想是拥有2个不同的数据模型来处理命令和查询。这些被称为“写入模型”和“读取模型”。 让我们考虑一个Twitter应用程序克隆的示例。以下是命令: 用户可以自己注册。CreateUserCommand(string username)发出UserCreatedEvent 用户可以关注其他用户。FollowUserCommand(int userAId, int userBId)发出UserFollowedEvent 用户可以创建帖子。CreatePostCommand(int userId, string text)发出PostCreatedEvent 虽然我在上面使用了“事件”一词,但我并不是说“事件源”事件。我的意思是触发读取模型更新的信号。我没有活动存储,到目前为止,我想专注于CQRS本身。 这是查询: 用户需要查看其帖子列表。 GetPostsQuery(int userId) 用户需要查看其关注者列表。 GetFollowersQuery(int userId) 用户需要查看其后的用户列表。 GetFollowedUsersQuery(int userId) 用户需要查看“朋友供稿”-他们所有朋友活动的日志(“您的朋友约翰刚刚创建了一个新帖子”)。 GetFriedFeedRecordsQuery(int userId) 要处理,CreateUserCommand我需要知道这样的用户是否已经存在。因此,在这一点上,我知道我的写模型应该具有所有用户的列表。 要处理,FollowUserCommand我需要知道userA是否已经跟随userB。在这一点上,我希望我的写模型具有所有用户关注用户连接的列表。 最后,要处理CreatePostCommand我不需要其他任何东西,因为我没有诸如之类的命令UpdatePostCommand。如果有这些内容,则需要确保该帖子存在,因此我需要所有帖子的列表。但是因为我没有此要求,所以不需要跟踪所有帖子。 问题1:以我使用的方式使用术语“写模型”实际上正确吗?还是ES的“写模型”总是代表“事件存储”?如果是这样,我需要处理命令的数据和我需要处理查询的数据之间是否存在任何分隔? 要处理GetPostsQuery,我需要所有帖子的列表。这意味着我的阅读模型应具有所有帖子的列表。我将通过收听来维护此模型PostCreatedEvent。 要同时处理GetFollowersQuery和GetFollowedUsersQuery,我需要一个用户之间所有连接的列表。为了维持这种模式,我要听UserFollowedEvent。这是第2个问题:如果我在这里使用写模型的连接列表,实际上可以吗?还是我应该更好地创建一个单独的读取模型,因为将来可能需要比写入模型更多的细节? 最后,要处理,GetFriendFeedRecordsQuery我需要: 听 UserFollowedEvent 听 PostCreatedEvent 了解哪些用户关注其他用户 如果用户A跟随用户B并且用户B开始跟随用户C,则应显示以下记录: 对于用户A:“您的朋友用户B刚刚开始关注用户C” 对于用户B:“您刚刚开始关注用户C” 对于用户C:“用户B现在正在关注您” 这里的问题3:我应该用什么模式来获取连接列表?我应该使用写模型吗?我应该使用读取模型- GetFollowersQuery/ GetFollowedUsersQuery吗?还是应该让GetFriendFeedRecordsQuery模型本身处理UserFollowedEvent并维护自己的所有连接列表?
11 cqrs  read-model 

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.