软件工程

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

8
不代表任何内容的类-是否正确?
我只是在设计应用程序,不确定我是否正确理解SOLID和OOP。类应该做一件事情并且做得很好,但另一方面,它们应该代表我们所使用的真实对象。 就我而言,我对数据集进行特征提取,然后进行机器学习分析。我假设我可以创建三个类 FeatureExtractor 数据集 分析仪 但是FeatureExtractor类不代表任何东西,它的作用使它比类更像是一个例程。它只有一个将要使用的函数:extract_features() 创建不代表一件事而是做一件事的类是否正确? 编辑:不确定是否重要,但我正在使用Python 并且如果extract_features()看起来像这样:是否值得创建一个特殊的类来保存该方法? def extract_features(df): extr = PhrasesExtractor() extr.build_vocabulary(df["Text"].tolist()) sent = SentimentAnalyser() sent.load() df = add_features(df, extr.features) df = mark_features(df, extr.extract_features) df = drop_infrequent_features(df) df = another_processing1(df) df = another_processing2(df) df = another_processing3(df) df = set_sentiment(df, sent.get_sentiment) return df

10
可以接受依赖于唯一的随机整数吗?
我一直在执行网络协议,并且我要求数据包具有唯一的标识符。到目前为止,我只是生成随机的32位整数,并假设从天文学角度来看,在程序/连接的生命周期内不会发生冲突是不太可能的。这是生产代码中通常被认为可以接受的做法,还是应该设计一种更复杂的系统来防止冲突?

8
如果有意义的值超出范围,我应该抛出异常还是自己处理?
我写了一个表示纬度/经度坐标的结构。对于纬度,其值的范围是-180至180,对于纬度,其值的范围是90至-90。 如果该结构的用户给我提供的值超出该范围,则我有2个选择: 引发异常(arg超出范围) 将值转换为约束 因为坐标-185具有含义(因为极坐标可以很容易地将其转换为+175),所以我可以接受并转换它。 最好抛出一个异常来告诉用户他的代码给了我一个它不应该具有的值吗? 编辑:另外,我知道纬度/经度和坐标之间的区别,但是我想简化一下以便于讨论-这并不是最聪明的主意

5
干净的体系结构:用例包含演示者或返回数据?
的清洁体系结构建议让交互器调用实际执行的演示者(其被注入时,DIP以下)的处理响应/显示的用例。但是,我看到人们实现了这种体系结构,从交互器返回输出数据,然后让控制器(在适配器层中)决定如何处理它。除了没有明确定义交互器的输入和输出端口之外,第二种解决方案是否将应用程序职责泄漏到应用程序层之外? 输入和输出端口 考虑到Clean Architecture的定义,尤其是描述控制器,用例交互器和演示者之间关系的小流程图,我不确定我是否正确理解“用例输出端口”应该是什么。 像六边形体系结构一样,干净的体系结构区分主要端口(方法)和次要端口(由适配器实现的接口)。按照通信流程,我希望“用例输入端口”是主要端口(因此只是一个方法),而“用例输出端口”是要实现的接口,也许是使用实际适配器的构造函数参数,以便交互器可以使用它。 代码示例 举例来说,这可能是控制器代码: Presenter presenter = new Presenter(); Repository repository = new Repository(); UseCase useCase = new UseCase(presenter, repository); useCase->doSomething(); 演示者界面: // Use Case Output Port interface Presenter { public void present(Data data); } 最后,交互器本身: class UseCase { private Repository repository; private Presenter presenter; public UseCase(Repository …

2
性能是不完全使用SignalR(网络套接字)来代替传统REST API的唯一原因吗?
我曾SignalR在多个项目中实现实时消息传递功能。它似乎工作可靠,并且非常易于学习使用。 至少对我来说,诱惑是放弃开发Web API服务,并将其SignalR用于一切。 我觉得这可以通过深思熟虑的设计来实现,如果可以的话,这意味着将需要更少的客户端代码。更重要的是,这将意味着将有一个单一的服务接口,而不是一个分离的接口,并且在最坏的情况下,可以将其连接起来而无需考虑何时渲染事物,等等。 因此,我想知道: 除了性能之外,还有其他原因不使用SignalR代替所有Web服务吗? SignalR的性能是否足以引起人们的注意? 能够将服务器端对象和服务定义转换为客户端服务访问代码而不用愚蠢的东西一直是我的梦想node.js。例如,如果我定义了一个有趣的对象InterestingObject以及该对象的服务,CRUD则InterestingObjectService可以定义到该服务的标准URL路由-例如“ / {serviceName} / {methodName}”,但是我仍然需要编写客户端代码才能访问服务。由于对象将被从客户端传递到服务器和背部,没有实际的原因有在客户端代码中显式定义对象,也无需显式定义执行CRUD操作的路由。我觉得应该有一种标准化所有方法的方法,这样就可以在假定服务访问从客户端到服务器再到服务器的工作透明的前提下编写客户端,就像我在编写WinForms或Java时一样Applet或Native App或您拥有的东西。 如果SignalR足以代替传统的Web服务使用,则它可能是实现此目的的可行方法。SignalR已经包含使集线器像我描述的服务那样工作的功能,因此我可以定义一个通用基础(CRUD)服务,该服务可以开箱即用地提供所有这些功能。然后,我几乎可以认为服务访问是理所当然的,这使我免去了重新编写代码以访问约定可以访问的内容的烦恼-更重要的是,我不得不花时间编写代码来定义如何对其进行更新。 DOM。 阅读我的编辑后,我觉得这可能有点荒谬,所以请随时问我是否对我的想法有疑问。基本上,我希望服务访问尽可能透明。

6
解释器会产生机器代码吗?
我深入研究了编译器和解释器的主题。我想检查一下我的基本理解是否正确,所以让我们假设以下内容: 我有一种叫做“ Foobish”的语言,其关键字是 <OUTPUT> 'TEXT', <Number_of_Repeats>; 因此,如果我想在控制台上打印10次,我会写 OUTPUT 'Hello World', 10; Hello World.foobish文件。 现在,我用自己选择的语言(在这种情况下为C#)编写解释器: using System; namespace FoobishInterpreter { internal class Program { private static void Main(string[] args) { analyseAndTokenize(Hello World.foobish-file)//Pseudocode int repeats = Token[1]; string outputString = Token[0]; for (var i = 0; i < repeats; i++) { Console.WriteLine(outputString); …

5
如何避免典型的“动态语言错误”?
我最近在JavaScript中投入了几个小时,因为我想从庞大的用户群中受益。这样做时,我注意到大多数人都将其归因于动态语言。您可以使事情真正快速地工作,但是一旦代码达到一定的大小,通常会浪费大量时间进行类型,拼写和重构错误。错误通常会使我免于编译器的困扰。当我在另一个模块中输入错字时,不必让我寻找逻辑错误。 考虑到以下令人难以置信的JavaScript和其他动态类型语言使我相信我的方法有问题。还是这仅仅是您必须支付的价格? 简而言之: 您如何使用〜2000 LOC处理JavaScript(或其他动态语言)项目? 有没有工具可以防止我犯这些错误?我已经尝试了Facebook和JSHint的流程,这对您有所帮助,但请不要输入错字。

10
为什么您的代码不应使用100%CPU?[关闭]
我专门讲的是在Windows XP或更高版本上运行的C#.NET 4程序,但是一般的答案也是可以接受的。 假设一个已经优化和高效的程序。这里的问题完全归结于CPU使用率高对硬件的影响,以及是否应该限制高使用率的程序以减少磨损,而不是取决于我的实现是否有效。 今天的一位同事建议我不要在数据加载过程中实现100%CPU利用率的目标,因为“现代CPU价格便宜,并且在100%CPU时会迅速降级”。 这是真的?如果是这样,为什么?以前,我给人的印象是100%CPU使用率对于密集或长时间的操作来说是更可取的,而且我在这两种方法上都找不到任何可敬的资源。
42 c#  multithreading  cpu  usage 

8
以函数名称开头的句子?[关闭]
有时在键入与区分大小写的编程语言有关的内容时,我最终会以函数名开头一个句子。现在,英语规则规定句子中的第一个单词必须大写。函数名称是小写的。如果您想知道我会说什么导致第一个单词成为函数名,请考虑以下示例: 您的恐惧实现已损坏。fread需要返回已读取的字节数。 我知道我可以将fread的第二个实例更改为It,但我想知道处理此错误的最佳方法,而不仅仅是重写句子。我应该大写功能名称吗?我想听到“重写句子”作为答案的唯一方法是,如果以函数名开头的句子违反了我不知道的某些英语规则。编辑:我真的很感谢大家的这些答案。他们已经改变并改善了我对该问题的见解。我从中学到了很多。我没有想到这些简单但好的解决方案,这让我感到非常惊讶。 我确实认为我对交替句子的立场太过苛刻,现在我意识到,由于这些好答案,整体更改句子似乎是处理这些情况的最佳选择,无论是在函数后面加上括号还是在函数之前说出函数函数名称,如果可用,请使用格式设置函数名称。
42 functions 

6
首席开发人员在敏捷团队中的作用是什么?
在非敏捷开发团队中,首席开发人员通常: 设置标准(编码等) 为团队研究新技术 为团队设定技术方向 对事情有最终决定权 设计系统架构 但是,敏捷团队的工作方式有所不同: 敏捷团队将依靠紧急设计,而不是预先设计 敏捷团队一起设计,而不是由一个人决定设计 敏捷团队决定自己的技术方向,这是交付项目的最佳选择 这将使敏捷开发团队中的首席开发人员离开哪里?在敏捷团队中是否可能有首席开发人员?敏捷团队是否需要与领导不同的职责?

3
是否存在不能以10为基数但可以以2为基数的数字?
C#的decimal类型用于需要以10为底的精确表示的数字。例如,0.1不能以2为底(例如float和double)表示,并且在存储在这些类型的变量中时始终为近似值。 我想知道相反的事实是否还可能。是否存在以10为基数不能表示但可以以2为基数表示的数字(在这种情况下,我想使用a float代替a decimal来处理它们)?

9
编程以供将来使用接口
我旁边有一位同事,他设计了这样的界面: public interface IEventGetter { public List<FooType> getFooList(String fooName, Date start, Date end) throws Exception; .... } 问题是,现在,我们在代码中的任何地方都没有使用此“ end”参数,它只是存在,因为将来可能需要使用它。 我们试图说服他,将参数放入当前不使用的接口是一个坏主意,但是他坚持认为,如果我们实现一段时间的“结束”日期使用,则必须做很多工作之后,必须修改所有代码。 现在,我的问题是,是否有任何来源正在处理像“尊敬的”编码专家这样的主题,我们可以将其链接到?

7
我如何根据主管的建议停止设计并开始设计该项目?[关闭]
我是一名初级开发人员(约3年经验),在我的工作中,我们正在设计一个新系统。我的首席开发人员将是首席架构师,但是他向我提出挑战,要求我自己(并行)架构系统。 在反复集思广益的想法并提出我认为是架构建议的过程中,我的领导给了我反馈,我所做的大部分工作都是“设计”而不是“架构”。 他将差异描述为架构与实现无关,而设计是对实现的描述。他说我需要脱下设计师的帽子,戴上建筑师的帽子。他给了我一些建议,但我也想问你: 如何摆脱软件设计师模式,开始像架构师那样思考? 以下是我提出的一些“设计” 示例,这些示例被我的领导认为与架构无关: 我想出了一种用于从系统中加载和卸载资源的算法,我的负责人说算法绝对不是体系结构。 我想出了系统应该引发的一系列事件以及应该以什么顺序引发它们,但是这似乎也没有将其视为架构。 我似乎陷入了细节之中,没有退后一步。我发现,即使我提出的是体系结构级别的内容,我也经常通过尝试各种实现并仔细研究细节,然后进行概括和抽象来达到目标​​。当我向我的领导描述时,他说我采用了错误的方法:我需要思考的是“自上而下”而不是“自下而上”。 这里是有关该项目的一些更具体的细节: 我们正在设计的项目是一个Web应用程序。 我估计大约有10到10万行代码。 我们是一家初创公司。我们的工程团队大约3-5人。 我可以将应用程序与之最接近的是轻量级CMS。它具有类似的复杂性,并且主要处理组件的加载和卸载,布局管理以及插件样式的模块。 该应用程序是ajax-y。用户一次下载客户端,然后根据需要从服务器请求数据。 我们将使用MVC模式。 该应用程序将具有身份验证。 我们不是很在意旧的浏览器支持(哇!),因此我们希望利用现有的最新和最大的支持。(HTML5,CSS3,WebGL ?、媒体源扩展等等!) 这是该项目的一些目标: 应用程序需要扩展。在不久的将来,我们的用户数量将达到数百至数千,但我们正在计划数以万计至数百万甚至更多。 我们希望该应用程序永远存在。这不是临时解决方案。(实际上,我们已经有了一个临时的解决方案,而我们正在设计的是长期替代现有的解决方案)。 该应用程序应该安全,因为它可能与敏感的个人信息联系在一起。 应用程序必须稳定。(理想情况下,它在gmail级别左右是稳定的,但不必在火星漫游者的极端位置。)

2
移动应用程序中的数据同步-多个设备,多个用户
我正在考虑构建我的第一个移动应用程序。该应用程序的核心功能之一是多​​个设备/用户将有权访问相同的数据,并且所有设备/用户都将具有CRUD权限。 我认为该体系结构应包含一个存储所有数据的中央服务器。设备将使用API​​与服务器交互以执行其数据操作(例如,添加记录,编辑记录,删除记录)。 我想象一个场景,其中的数据同步将成为一个问题。假定该应用程序在未连接到Internet时应能正常工作,因此无法与此中央服务器通信。所以: 用户A离线,并编辑记录#100 用户B离线,并编辑记录#100 用户C离线,并删除记录#100 用户C联机(大概记录#100应该在服务器上被删除) 用户A和B联机,但是他们编辑的记录不再存在 可能出现与上述类似的各种情况。 一般如何处理?我计划使用MySQL,但想知道它是否不适用于此类问题。
42 database  mysql  data  mobile 

7
我可以花多少时间在工作上学习?[关闭]
到目前为止,我已经从事软件开发工作约两年了。显而易见,在软件开发如此迅速发展的领域中,您需要花时间学习新技术,框架等。 我一直认为我可以认为是理所当然的,如果我需要学习一些解决工作中的问题的方法,那么我也可以自由地花费一些时间来学习工作中的问题。但是,我已经与不同的同事讨论了这个话题,我们的看法截然不同,显然是在两个极端之间: 您的雇主付钱给您了解知识。您是因为拥有完成这项工作所需的专业知识的知识而被录用的,并且如果这个领域出现了,因此您需要学习更多的知识,那么您自然会在空闲时间这样做。 另一个极端是 从长远来看,使我的工作效率更高的任何事情,都值得花时间在工作上,因为雇主最终将从中获利。这当然适用于学习新技术,但也适用于例如学习VIM以使其更快等。 但是,即使在与那些倾向于第二个极端的人讨论花多长时间时,我们的看法也大相径庭,范围从“时不时一个小时”到“需要多长时间”。 您的工作场所是否鼓励学习新技能?如果是,他们必须采用什么程序来鼓励学习新技能?在作为程序员的那一天,您花费多少时间学习新事物(而不编写生产代码)?

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.