软件工程

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

4
具有不同输入参数的工人的C#设计模式
我不确定哪种设计模式可以帮助我解决此问题。 我有一个类“ Coordinator”,该类确定应使用哪种Worker类-不必知道那里有所有不同类型的Worker-它仅调用WorkerFactory并根据通用IWorker接口起作用。 然后,它将适当的Worker设置为工作并返回其“ DoWork”方法的结果。 到目前为止还不错。我们对新的Worker类有一个新的要求,即“ WorkerB”,它需要额外的信息量,即额外的输入参数,才能使其工作。 就像我们需要一个带有额外输入参数的DoWork方法重载...但是所有现有的Workers都必须实现该方法-这似乎是错误的,因为这些Workers确实不需要该方法。 我该如何重构,以使协调器不知道正在使用哪个工作人员,并且仍然允许每个工作人员获取完成其工作所需的信息,但没有任何工作人员执行不需要的信息? 已经有很多现有的工人。 我不想更改任何现有的具体Workers来适应新WorkerB类的要求。 我以为Decorator模式在这里会很好,但是我之前没有看到任何Decorator用相同的方法但参数不同来装饰对象... 代码情况: public class Coordinator { public string GetWorkerResult(string workerName, int a, List<int> b, string c) { var workerFactor = new WorkerFactory(); var worker = workerFactor.GetWorker(workerName); if(worker!=null) return worker.DoWork(a, b); else return string.Empty; } } public class WorkerFactory { …

6
从下面的代码片段中跳过太多if / else-if的更好方法是什么?
我正在尝试编写一个servlet,它根据传递给它的“操作”值执行任务。 这是其中的示例 public class SampleClass extends HttpServlet { public static void action1() throws Exception{ //Do some actions } public static void action2() throws Exception{ //Do some actions } //And goes on till action9 public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { String action = req.getParameter("action"); /** * I find …

2
在MongoDB的键中插入带有`.`的JSON文档
首先,这更多的是设计问题,而不是编程问题。 我正在创建一个应用程序,在其中我必须获取现有的JSON数据并将其插入MongoDB。我发现某些JSON文档.的密钥中有一个句点。我在MongoDB文档中读到,在MongoDB .中不允许将句点用作键,因为它们用于查询。 我在Web应用程序中没有做很多插入,这几乎是一次插入。另外,我主要会检索整个文档,而不是查询部分文档,因为我需要获取所有数据。 因此,考虑到我的需求,关于如何存储JSON文档,我有两种选择: 在JSON中搜索密钥中的句点并转义,然后将其插入MongoDB。 将整个JSON转换为BSON格式并按原样存储它们,从而避免转义的需要,并在需要时在MongoDB外部手动解析JSON 您能否告诉我哪种设计更好,因为我无法得出结论。
14 json  mongodb 

1
C#字典的效率
C#字典是查找某些东西是否存在等的简单方法。但是我对它们的工作方式有疑问。假设不是字典,而是使用ArrayList。我没有使用ContainsKey(或使用另一种语言的等效方法)循环遍历ArrayList来检查那里是否存在某些东西(或者如果对数据进行排序或类似的操作,则执行二进制搜索)。效率有何不同?该ContainsKey方法是否使用某种更有效的方法,而不是遍历键并检查我搜索的内容是否存在? 如果说我创建了一个特定的哈希函数,该哈希函数与我拥有的数据类型相对应,并且是专门针对该数据集而设计的,那么是的,该哈希函数的确比循环遍历数据的速度更快。但是字典是通用的。ContainsKey方法不是特定于它获取的数据,它是一种常规的搜索方法。 基本上我要问的是。词典对程序员很有帮助。它们包括对许多事情有帮助的方法,并且它们将字符串与整数,(键和值)等结合在一起。但是关于效率,他们提供了什么?什么是在具有的差异dictionaryVS一个ArrayList的structs(string,int)

1
我应该使用命令还是事件?
在总线通信中,命令和事件之间的区别在我看来似乎有点模糊。我知道命令应该只执行一次,而一个事件可以处理多次,但是我仍然不确定何时使用命令或事件。 让我们看一个例子: 当新用户注册到Web应用程序时,我们应该为他创建一个帐户并发送确认电子邮件。 创建帐户 -这似乎是将a发送CreateUserCommand到总线并由专门的组件处理的正确位置。 也许这甚至不应该使用异步总线通信来实现?我们希望用户能够立即登录到应用程序。对于总线,我们无法保证命令将在何时执行。 发送电子邮件 -组件创建帐户后,我可以看到2种可能性 向总线发送另一个命令 SendConfirmationEmailCommand 发布活动 UserAccountCreatedEvent 而不是让电子邮件发件人组件抓住它并完成任务。 一方面,我希望确认电子邮件仅发送一次(使用命令),另一方面,我相信可能有多个对新注册用户感兴趣的组件。记录器或SMS发送者。 您将如何实施?

5
可以用全大写字母命名枚举来简化其String表示吗?
几次我见过人们对枚举常量使用标题大小写或什至所有小写字母命名,例如: enum Color { red, yellow, green; } throw new IllegalStateException("Light should not be " + color + ".")例如,如果要这样做,这使得使用它们的字符串形式变得简单容易。 如果枚举是private,这似乎可以接受,但我仍然不喜欢它。我知道我可以使用String字段创建一个枚举构造函数,然后重写toString以返回该名称,如下所示: enum Color { RED("red"), YELLOW("yellow"), GREEN("green"); private final String name; private Color(String name) { this.name = name } @Override public String toString() { return name; } } 但是,看那还要多久。如果您有一堆小的枚举要保持简单,那么继续这样做很烦人。可以在这里只使用非常规大小写格式吗?
14 java  conventions  enum 

5
您如何处理多方项目中的版本控制?
我知道这是一个广泛的问题,所以我将尽量具体。这个问题比技术性问题更像是一个“组织性”问题。 我们有一个包含以下主要组成部分的多面项目: 服务器,托管核心业务逻辑(数据模型) 使用核心业务逻辑的客户后台 也使用核心业务逻辑的应用程序API(REST) 有使用应用程序API的智能手机应用程序(iOS和android) 还有另一个平板电脑应用程序(android)与使用相同应用程序API的智能手机不同。 很快,我将在活跃的客户中投入生产。作为任何项目,我都需要随着时间的推移维护所有不同的组件。这意味着可以升级以下所有内容: 服务器中核心业务逻辑的代码(由后台,API使用,并且副作用是由移动应用程序使用) API本身(由智能手机和平板电脑应用程序使用) 所有移动应用(通过appstore / googleplay) 当然,服务器端部分(核心业务逻辑代码和API代码)可以由我自己立即更改。但是,客户端必须在appstore / googleplay上下载新的移动应用程序,而且我不确定它们是否是最新的。 您能否提供任何指导和良好操作技巧,以使这些升级顺利进行,并且对客户没有风险? 我需要“版本”的哪个组件?即使客户端不升级其移动应用程序,如何确保一切正常?我应该强迫他升级以简化工作吗? 简而言之,我应该如何组织才能使我的多面项目随着时间的推移而上线?

2
休眠线程如何工作?
当您休眠线程时,实际上是什么情况? 我看到休眠线程“在给定的时间段内暂停了当前线程”。但是,它是如何工作的呢? 根据Thread.sleep()在内部如何工作以及Thread.sleep如何真正工作?: 睡眠时间将取决于某些系统特定的粒度 睡眠受阻 线程离开CPU并停止执行 线程在睡眠时不占用CPU时间 我只是不太了解这一切意味着什么的内部和基本机制。 我知道有一个称为调度程序的东西负责线程之间的切换。 消息来源似乎表明这随操作系统(或硬件?)而变化,并且大多数线程被赋予1ms-60ms左右的时间,以便在CPU切换到另一个线程之前执行某些操作。 但是,当线程休眠时(例如,数秒),它如何恢复?我猜想其中涉及一个计时器,它是主板的时钟吗?它与CPU时钟速率有关吗? 即使涉及计时器,CPU如何知道何时该再次关注该线程?是否不必经常检查线程以查看其是否准备就绪?这不是有效的轮询,因此会浪费CPU时间吗? 是在休眠特定于线程语言的线程,还是由操作系统负责,还是CPU特定的事物? 有人可以通过诸如调度程序之类的基本解释以及CPU在所有这些过程中的作用向我解释一下吗?

4
对DTO使用合成和继承
我们有一个ASP.NET Web API,它为我们的单页应用程序提供了REST API。我们使用DTO / POCO通过此API传递数据。 现在的问题是,随着时间的推移,这些DTO越来越大,所以现在我们要重构DTO。 我正在寻找如何设计DTO的“最佳实践”:当前,我们有一些小的DTO,它们仅包含值类型字段,例如: public class UserDto { public int Id { get; set; } public string Name { get; set; } } 其他DTO按组成使用此UserDto,例如: public class TaskDto { public int Id { get; set; } public UserDto AssignedTo { get; set; } } 另外,还有一些扩展的DTO是通过从其他对象继承来定义的,例如: public class …
13 rest  api-design  web-api  dto  poco 

5
带有Web API的纯前端JavaScript与带有Ajax的MVC视图
这更多是关于人们近来对如何拆分Web应用程序的想法的讨论。 我习惯于使用其所有视图和控制器来创建MVC应用程序。通常,我将创建一个完整视图,并在一个完整页面请求中将其传递回浏览器,除非我不想立即填充特定区域,然后使用DOM页面加载事件来调用服务器来加载其他区域使用AJAX。 同样,当涉及部分页面刷新时,我将调用MVC操作方法,该方法将返回HTML片段,然后可以使用该HTML片段填充页面的某些部分。这将用于那些我不想减慢初始页面加载速度的区域,或者是更适合AJAX调用的区域。一个示例是表分页。如果您想转到下一页,我希望在AJAX调用获得该信息而不是使用整页刷新的情况下使用。但是AJAX调用仍然会返回HTML片段。 我的问题是。我对这个古老的想法是因为我来自.net背景,而不是纯粹的前端背景吗? 与我一起工作的聪明的前端开发人员,宁愿在MVC视图中什么也不做,而宁愿在前端做任何事情。一直到填充页面的Web API调用。因此,他宁愿返回一个标准对象并使用javascript创建页面的所有元素,而不是调用返回HTML的MVC操作方法。 前端开发人员的方式意味着我通常通过MVC模型验证(包括客户端验证)获得的任何好处都将消失。这也意味着我创建视图,使用强类型html模板等获得的任何好处都将消失。 我相信这意味着我需要为前端和后端验证编写相同的验证。javascript还需要有很多方法来创建DOM的所有不同部分。例如,当向表中添加新行时,我通常会使用MVC部分视图创建该行,然后将其作为AJAX调用的一部分返回,然后将其注入表中。通过使用纯前端方式,javascript将为api调用中的行引入一个对象(例如产品),然后从该对象创建一行。创建表行的每个单独的部分。 有问题的网站将在管理,表格,产品搜索等方面有很多不同的领域。我认为不需要以单一页面应用程序方式构建的网站。 大家对此有何想法? 我很想听听前端开发人员和后端开发人员的意见。

5
为什么编译器的输出称为目标代码?
摘自Paul Graham 解释的论文《编程语言》,发表在Hackers&Painters上: 您向编译器提供的高级语言也称为 源代码,其生成的机器语言翻译称为目标代码。 摘自Wikipedia关于目标代码的文章: 目标代码或有时是目标模块是计算机编译器生成的。 根据“编译器”的定义: 传统上,编译的输出称为目标代码或有时称为目标模块。(请注意,此处的“对象”一词与面向对象的编程无关。) 那么,什么是涉及到长期目标?

2
“真正的程序员可以用任何语言编写汇编代码”是真的吗?
真正的程序员可以用任何语言编写汇编代码。 (拉里·沃尔)。 据我所知,拉里·沃尔(Larry Wall)先生想对一个真正的程序员说,任何一种语言都可以具有与ASM相同的功能。但是我严重不明白。如何使用Perl,Python,Java和C#等高级语言编写汇编代码?像Perl和Python这样的语言甚至没有指针。还是他有其他意思?沃尔先生实际上想说什么?

8
自学/没有经验的程序员的简历应该是什么样的?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 不久前,我问了一个问题,即知道何时准备好找工作并得到积极的答复。现在,我正在写简历以开始我的工作。 标题几乎可以概括这个问题,简历中只具有个人项目经验的自学成才的程序员该怎么办? PS。我真正要问的是让某人快速浏览我的简历(草稿),但是我知道这太具体了。有什么地方可以问这种问题吗? 编辑:感谢大家的反馈。我已经完成了RC版本,希望不久就会进入就业市场。
13 resume 

3
使用C / C ++宏作为条件编译的快捷方式是一种好习惯吗?
假设我要在代码中包含几种类型的输出消息。其中之一是DEBUG,仅当在Debug模式下编译代码时才打印。 通常我必须写一些像 #ifdef DEBUG std::cout << "Debug message" << std::endl; #endif 在许多地方使用起来非常麻烦和烦人。 为代码段定义宏是一种好习惯,这样您就可以使用它吗? MSG_DEBUG("Debug message") 还是有没有其他更优雅的方式在没有宏的情况下如何处理它?我对C和C ++中可能的解决方案感兴趣,因为我在不同的项目中使用了这两种语言。
13 c++  c  macros 

7
将高频事件保存到连接限制受限的数据库中
我们有一种情况,我必须处理大量涌入服务器的事件,平均每秒大约1000个事件(峰值可能是2000个)。 问题 我们的系统托管在Heroku上,并使用相对昂贵的Heroku Postgres DB,该数据库最多允许500个DB连接。我们使用连接池从服务器连接到数据库。 事件传入的速度快于数据库连接池无法处理的速度 我们遇到的问题是事件的发生速度快于连接池无法处理的速度。到一个连接完成从服务器到DB的网络往返时,它可以释放回池中,而不是n其他事件。 最终,事件堆积起来,等待保存,并且由于池中没有可用的连接,它们超时并且整个系统变得无法运行。 我们已经通过以较慢的速度从客户端发出有问题的高频事件来解决紧急情况,但是我们仍然想知道在需要处理高频事件时如何处理这种情况。 约束条件 其他客户端可能希望同时读取事件 其他客户端连续请求使用特定密钥读取所有事件,即使它们尚未保存在数据库中也是如此。 客户端可以查询GET api/v1/events?clientId=1并获取客户端1发送的所有事件,即使这些事件尚未保存到DB中也是如此。 是否有有关如何处理此问题的“教室”示例? 可能的解决方案 使事件排队在我们的服务器上 我们可以在服务器上排队事件(队列的最大并发性为400,因此连接池不会用完)。 这是个坏主意,因为: 它将耗尽可用的服务器内存。堆积的排队事件将消耗大量RAM。 我们的服务器每24小时重启一次。这是Heroku施加的硬限制。当事件排队时,服务器可以重新启动,导致我们丢失排队的事件。 它在服务器上引入状态,从而损害了可伸缩性。如果我们有一个多服务器设置,并且客户端要读取所有已排队+保存的事件,则我们将不知道已排队事件在哪台服务器上。 使用单独的消息队列 我假设我们可以使用消息队列(例如RabbitMQ吗?),在其中将消息泵入其中,另一方面,还有另一台服务器仅处理将事件保存在DB上。 我不确定消息队列是否允许查询排队的事件(尚未保存),因此,如果另一个客户端想要读取另一个客户端的消息,我只能从数据库中获取已保存的消息,并从队列中获取待处理的消息。并将它们连接在一起,这样我就可以将它们发送回读取请求客户端。 使用多个数据库,每个数据库使用中央数据库协调器服务器保存一部分消息,以管理它们 不过,我们的另一个解决方案是使用多个数据库,并使用一个中央“ DB协调器/负载平衡器”。接收到事件后,此协调器将选择一个数据库来写入消息。这应该允许我们使用多个Heroku数据库,从而将连接限制提高到500 x数据库数。 在进行读取查询时,此协调器可以SELECT向每个数据库发出查询,合并所有结果,然后将其发送回请求读取的客户端。 这是个坏主意,因为: 这个主意听起来像是...太设计了吗?管理(备份等)也将是一场噩梦。它的构建和维护非常复杂,除非绝对必要,否则听起来像是违反了KISS。 它牺牲了一致性。如果我们遵循这个想法,那么跨多个数据库进行事务是不可行的。

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.