软件工程

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

7
我该如何防止意外地重复代码?
我在相当大的代码库上工作。数百个类,大量不同文件,许多功能,花费15分钟以上的时间才能提取新副本等。 如此庞大的代码库的一个大问题是,它具有相当多的实用程序方法,它们执行相同的操作,或者具有可能时不使用这些实用程序方法的代码。而且,实用程序方法不只是全部在一个类中(因为这将是一个巨大的混乱)。 我对代码库比较陌生,但是多年来致力于该代码工作的团队负责人似乎也遇到了同样的问题。这会导致很多代码和工作重复,因此,当发生问题时,通常会分成4个基本相同的代码副本 我们如何遏制这种模式?与大多数大型项目一样,并非所有代码都已记录在案(尽管有些文件已记录在案),并且并非所有代码都...很整洁。但是从根本上说,如果我们能够在这方面提高质量,那真是​​太好了,这样将来我们就可以减少代码重复,并且更容易发现实用程序之类的东西。 而且,实用程序函数通常在某个静态帮助器类中,在单个对象上工作的某些非静态帮助器类中,或者是主要“帮助”于其上的类的静态方法。 我进行了一个实验,将实用程序功能添加为扩展方法(我不需要该类的任何内部组件,并且肯定只在非常特定的情况下才需要)。这样可以防止主类杂乱无章,但除非您已经知道,否则实际上再也找不到了。


3
谁应该控制MVVM应用程序中的导航?
例1:我的MVVM应用程序中显示了一个视图(出于讨论目的,请使用Silverlight),然后单击一个按钮,该按钮会将我带到新页面。 示例2:同一视图具有另一个按钮,单击该按钮后应在子窗口(对话框)中打开详细信息视图。 我们知道,将有ViewModel公开的Command对象绑定到按钮,这些对象具有响应用户单击的方法。但是,那又如何呢?我们如何完成该动作?即使我们使用所谓的NavigationService,我们在说什么呢? 更具体地说,在传统的“视图优先”模型(如基于URL的导航方案,例如Web或SL内置导航框架)中,Command对象必须知道接下来要显示的视图。当涉及由模式促进的关注点分离时,这似乎越界了。 另一方面,如果未将按钮连接到Command对象,并且其行为类似于超链接,则可以在标记中定义导航规则。但是我们是否希望Views控制应用程序流,并且导航不只是另一种业务逻辑吗?(在某些情况下我可以说是,在其他情况下我可以说不。) 对我来说,MVVM模式的乌托邦式实现(我听说其他人对此表示赞同)将以一种可以使应用程序无头运行(即无视图)的方式连接ViewModel。这为基于代码的测试提供了最大的表面积,并使Views成为应用程序的真实外观。而且我的ViewModel不在乎它是否显示在主窗口,浮动面板或子窗口中,应该吗? 根据这种方法,在运行时由其他机制来“绑定”应该为每个ViewModel显示的视图。但是,如果我们想与多个ViewModel共享一个View,反之亦然呢? 因此,鉴于需要管理View-ViewModel关系,以便我们知道在视图之间导航时需要显示的内容(包括显示子窗口/对话框),我们如何真正在MVVM模式中完成此操作?


3
跨微服务共享DTO的方法?
我的情况如下。 我正在设计一个系统,该系统旨在从各种类型的传感器接收数据,然后进行转换并将其持久化,以供以后的各种前端和分析服务使用。 我正在尝试将每个服务设计为尽可能独立,但是遇到了一些麻烦。团队已决定要使用的DTO。面向外部的服务(传感器数据接收者)将以自己独特的方式接收数据,然后将其转换为JSON对象(DTO)并将其发送给Message Broker。消息的使用者将确切地知道如何读取传感器数据消息。 问题是我在几个不同的服务中使用了相同的DTO。必须在多个位置实施更新。显然,我们的设计方式使得此处的DTO中有一些多余或缺失的字段,并且在更新服务之前不会有太大的问题,但这仍然困扰着我,并使我感到自己犯错误。它很容易变成头痛。 我在设计系统时会出错吗?如果没有,那么有什么解决办法,或者至少可以缓解我的担心?

1
SQLite数据库的实际最大实际大小是多少?
根据有关SQLite适当用法的这篇文章,它说,尽管SQLite的限制为140 TB,但客户端/服务器RDBMS可能会更好地工作: SQLite数据库的大小限制为140 TB(2 47字节,128 TB)。即使可以处理更大的数据库,SQLite也会将整个数据库存储在单个磁盘文件中,而许多文件系统将文件的最大大小限制为小于此大小。因此,如果您正在考虑这种规模的数据库,那么最好考虑使用一个客户机/服务器数据库引擎,该引擎将其内容分布在多个磁盘文件中,甚至可能分布在多个卷中。 总的来说,我同意这一点,但是得知SQLite的最大限制如此之高,我感到很惊讶!根据我的经验,我已经使用了许多SQL Server数据库,其大小约为30-100GB。我还间接使用Oracle,Postgres或Cassandra处理更大的数据库。其中,至少就我所知,没有一个接近140TB。我不是DBA,因此根据我的直接经验,我认为这是“大笔”的事情。 对于数据库很小的情况,我只考虑过SQLite。最多几十兆。 阅读本文后,我仍然不相信要考虑将SQLite用于可能需要数百GB数据的任何事情。但是我想知道我是否一直在低估它的功能。在实际使用中,SQLite数据库的实际最大大小限制是多少?

3
Readme.txt与README.txt
我刚刚在Github中创建了一个项目,进行了更改等。这使我感到奇怪:我在开源项目中主要看到README.txt,而我编辑的文件是Readme.txt。这是某种形式的标准化还是我应该保留它?

6
我应该为每个应用程序使用一个数据库还是在多个应用程序中共享一个数据库?
我有多个应用程序,其中一些使用来自相同来源的数据。最佳做法(或优点/缺点)是: 将数据保留在多个应用程序共享的数据库中 节省空间,因为只需要一个数据库 索引复杂化,因为不同的应用程序具有不同的查询需求 每天将数据导入每个应用程序数据库 每个应用程序数据库中存在重复数据,因此使用更多空间 索引更容易,因为每个应用程序都可以专注于其各自的需求 我可能遗漏了其他优点/缺点,请列出(如果有),在您的工作场所该如何做?

7
分别建模名字和姓氏
在设计新系统时,应该考虑哪些参数,并且必须将一个人的姓名存储为一个字段,或者将其分别存储为名字/姓氏? 单一领域的优点: 简单的用户界面 尝试输入一个名字很长的人的名字时没有歧义(通常不明显,这是姓氏/名字..) 处理标题时的复杂度较低(例如,无需单独输入“ MD”或“ Dr.”) 拆分字段的优点: 可以通过“亲爱的X先生”或“亲爱的朱莉”进行个性化交流 如果使用的Web服务需要单独的名字/姓氏,则可以轻松提供。 对于具有严格标识要求的任何行业(例如医疗,政府等)的更好选择 选择更加安全,因为您可以随时返回到单一字段替代方案 您是否看到上面未列出的任何其他参数? 更新:问题是,可以为每个解决方案列出哪些其他(未在问题中列出)参数。我认为提出意见而不是可能的利弊会以错误的方式推动讨论。每个开发人员都必须对这个问题做出决定,这个问题的目的是汇编一个非平凡的参数列表,可以在需要时进行评估。

8
在哪里学习新技能适合敏捷?
我正在创建一家金融软件公司,在此过程中,我一直在研究敏捷原则和方法,而我尚未看到的开发方面之一是在哪里满足开发人员不断学习新技能和新技术的需求处理。 在过去几年从事财务软件工作之前,我大部分时间都是3D图形程序员,从事视频游戏以及GIS和生物识别软件的开发,而我一直很简单,就不得不从悬崖下钻研东西,并弄清楚如何飞。虽然我一直都成功,但我确信如果我没有一次又一次地每周工作数百个小时,甚至数月不致自杀,我将不会活到现在。 现在,我正在创建一家软件公司,该公司对3d图形的创新要求不高,因此我想建立一种更全面的开发方法。 也许敏捷只是不能解决这个问题,但是如果可以解决,那么我还没有找到答案,我将不胜感激任何人对此具有的专业知识或经验。
32 agile 

4
在Visual Studio中合并1年开发的策略
我有一个客户,坚持要求我们在2016年全年将我们的新开发与主要分支机构分开。他们还有3-4个其他团队以各种身份从事该应用程序的工作。已经进行了许多大的更改(切换依赖项注入的完成方式,使用ReSharper清理代码等)。现在,我不得不将main合并到我们的新dev分支中,以准备将我们的变更推向产业链。 在我最初的合并请求中,TFS报告了约6500个具有解决冲突的文件。其中一些将很容易,但其中一些将更加困难(特别是一些javascript,api控制器和支持这些控制器的服务)。 有什么办法可以使我更轻松? 为了澄清,在此过程中,我多次对此方法表示了很多关注。客户曾经并且知道与此有关的困难。因为他们选择短缺QA人员(一名测试人员需要4个开发人员,所以没有自动化测试,很少进行回归测试),所以他们坚持认为我们会把分支机构与主分支机构的更改隔离开来,以为这会减少对我们分支机构的需求。测试人员了解其他地方所做的更改。 这里最大的问题之一是对有角度版本和某些其他第三方软件的升级-不幸的是,直到所有组件放回原处,我们都没有想出一种构建此解决方案的好方法。

8
“变量应尽可能地处于最小范围内”是否包括“变量应尽可能不存在”的情况?
根据有关“ 原理变量比实例变量更喜欢局部变量? ” 的公认答案,变量应处于尽可能小的范围内。 将问题简化为我的解释,这意味着我们应该重构这种代码: public class Main { private A a; private B b; public ABResult getResult() { getA(); getB(); return ABFactory.mix(a, b); } private getA() { a = SomeFactory.getA(); } private getB() { b = SomeFactory.getB(); } } 变成这样的东西: public class Main { public ABResult getResult() { A …

5
我应该检查数据库中是否存在某些东西并且快速失败或等待数据库异常
有两节课: public class Parent { public int Id { get; set; } public int ChildId { get; set; } } public class Child { ... } 分配给时ChildId,Parent我应该首先检查数据库中是否存在它,或者等待数据库引发异常? 例如(使用实体框架核心): 注意,即使在官方的Microsoft文档中,这类检查也已遍及整个Internet:https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/getting-started-with-ef-using- MVC /处理与实体框架在ASP.NET MVC应用程序中的并发处理#修改部门控制器,但还有其他异常处理SaveChanges 另外,请注意,此检查的主要目的是向API用户返回友好消息和已知的HTTP状态,而不是完全忽略数据库异常。并且唯一引发异常的地方是在内部SaveChanges或SaveChangesAsync调用中...因此,当您调用FindAsync或时不会有任何异常Any。因此,如果子项存在但在此之前被删除,SaveChangesAsync则将引发并发异常。 我这样做的原因是,foreign key violation异常将很难格式化以显示“找不到ID为{parent.ChildId}的孩子”。 public async Task<ActionResult<Parent>> CreateParent(Parent parent) { // is this code redundant? // NOTE: its …

3
与以二进制存储等效消息相比,存储纯文本数据是否占用更少的空间?
作为一名Web开发人员,我对二进制数据了解甚少。 如果我使用句子“ Hello world。”,将其转换为二进制文件,然后将其作为二进制文件存储在SQL数据库中,似乎 1和0会比字母占用更多的空间。在我看来,使用字母有点像使用压缩,其中一个符号代表多个。 但这真的是这样吗? 与以二进制存储等效消息相比,存储纯文本数据是否占用更少的空间?

7
关于C#和Java是一半语言的陈述意味着什么?[关闭]
在文章:为什么选择POCO中,有这句话: Maciej Sobczak很好地指出:“我只是不喜欢有人给我一半的语言,并告诉我这是为了我自己的保护”。 我不明白他的意思,尽管C#是微软拥有与Java的由Oracle拥有的,但这并不意味着他们持有一半的语言,不是吗?我没有发现任何证据可以证明这一句话,对此我感到很好奇。甚至对“为了我自己的保护”部分感到好奇。
32 java  c#  microsoft  oracle 

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.