软件工程

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

4
多对多(连接)表中是否需要唯一ID列?
从EF开始一些项目,但是我对联接表和键等有一些疑问。可以说我有一个应用程序表和一个权限表。应用程序具有许多权限,每个许可权可以属于多个应用程序(多对多)。 现在,“应用程序”和“权限”表很简单: Applications -------------- PK ApplicationID Name Permissions -------------- PK PermissionID Name 但是做联接表的最佳方法是什么?我有两个选择: ApplicationPermissions ----------------------- PK ApplicationPermissionID CU ApplicationID CU PermissionID 要么 ApplicationPermissions ----------------------- CPK ApplicationID CPK PermissionID PK = Primary Key CPK = Composite Primary Key CU = Composite Unique Index 您曾经被一种方法折磨过吗?严格优先吗?我发现很多“差异”都会被我的存储库模式抽象化(例如,我几乎永远不会创建一个完整的权限对象并将其添加到应用程序中,而是通过ID或唯一名称或东西),但我想我正在寻找恐怖故事,一种或另一种方式。


7
在生产中记录用户操作的最佳做​​法
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 7年前。 我打算在生产环境中记录很多不同的东西,例如当用户: 登录,注销 变更个人资料 编辑帐户设置 更改密码...等 在生产环境中这样做是一种好习惯吗?还有什么是记录所有这些的好方法。我目前正在使用以下代码块登录: public void LogMessageToFile(string msg) { System.IO.StreamWriter sw = System.IO.File.AppendText( GetTempPath() + @"MyLogFile.txt"); try { string logLine = System.String.Format( "{0:G}: {1}.", System.DateTime.Now, msg); sw.WriteLine(logLine); } finally { sw.Close(); } } 这样可以生产吗?我的应用程序是一个非常新的应用程序,因此我不希望马上有数百万用户,或者寻找最佳实践来跟踪网站上的操作,甚至是最佳实践。
22 c#  asp.net  logging 

4
如何组建开发团队
我是一个由11位软件开发人员组成的团队的经理,他们负责管理我公司的网站/ Web应用程序,并随时运行多达4个并发项目以及日常支持。在11位开发人员中,技术技能,职称和经验混合在一起,尽管团队结构是平坦的,所有11位开发人员都直接向我报告。 整个团队只有一名经理,现在开始证明扩展性不是很好。我的传播范围太窄了,因此想减少直接报告的数量。我认为实现此目标的所有方式都有很大的缺点: 让初级开发人员向高级开发人员报告。这样可以减少最佳技术人员在开发上花费的时间。 按软件产品划分团队,例如,开发人员1-6在Intranet上工作,而7-11在外部站点上工作,每个部分都有新的团队负责人(可能是新职位描述,与当前的高级开发人员相比,具有更多的管理/指导/指导职责) )。这增加了人为的孤岛,并且如果我希望他们这样做的话,可能会很难使“内部网开发人员”在外部网站上工作。 保持结构平坦,以项目经理/团队管理员的身份添加管理支持,以减轻压力。这不能解决问题,因为团队无法永远这样成长。 有没有解决我所缺少的这个问题的标准方法? 如果没有,你们中的其他人如何解决了这个问题?
22 management  team 

4
GPL-什么是分销?
关于涉嫌盗用GPL项目的另一个话题提出了一个有趣的观点。在这种情况下,一些大型公司使用了企业软件,这些公司从实质上获取了代码,更改了名称,删除了GPL通知并使用了结果。 关键是-如果公司这样做并且仅在内部使用该软件,则没有任何发行版本,并且在GPL下完全合法。也可以允许其自己的员工进行内部修改。 那么什么时候它成为分布? 据推测,如果他们将外部承包商带入“出租工作”中,其修改也将是内部的,因此不是分配的。 如果他们雇用了外部软件公司进行修改,而这些更改仅由公司内部使用,那么这些更改是否可以分发?GPL适用于客户还是外部开发人员? 如果公司然后将结果提供给另一个部门,另一个业务部门,另一个公司?如果另一家公司是全资子公司怎么办? ps。是的,我知道答案是问律师。但是我所见过的有关GPL2 / GPL3 分发的所有讨论都是关于Web服务的,而不是关于内部使用的。
22 legal  gpl 

6
单元测试真的用作文档吗?
我无法数出“单元测试是被测代码文档的重要来源”这一类读语句的次数。我不否认他们是真实的。 但就我个人而言,我从来没有发现自己将它们用作文档。对于我使用的典型框架,方法声明记录了它们的行为,而这就是我所需要的。我假设单元测试将备份该文档中所述的所有内容,并可能还会添加一些其他内部内容,因此,一方面它会复制文档,而另一方面可能会添加一些不相关的内容。 所以问题是:什么时候将单元测试用作文档?什么时候评论不能涵盖所有内容?通过开发人员扩展源代码?他们公开了哪些文档本身无法公开的有用和相关的内容?

3
什么时候应该将类或模块放在单独的Assembly / DLL中?
是否有任何准则来决定何时将一个类放在其自己的程序集中/ DLL中?我经常看到两种思想流派: 1)每个类的“分组”都属于其自己的DLL,例如存储库,服务,DTO,基础结构等。 2)一切都应在单个DLL中,但应通过名称空间/文件夹分开,例如,具有“ Core” DLL以及其他名称空间,例如Core.Repositories,Core.Services,Core.DTO等。 在工作中,我们将所有组件都集中在一个称为“业务”的程序集中。有一些文件夹,但没有真正的分离-业务对象(带有逻辑,其中一些甚至不应该是类)被放在“ BusinessObjects”文件夹中而不用管。多个类中使用的内容位于“ Core”文件夹中。实用程序位于“实用程序”文件夹中,数据访问基础结构位于“数据”文件夹中-您就明白了。 对于我正在使用的新模块,我希望/需要一个单独的数据访问层(认为是基本的存储库实现),但我不想将其与其他160个一起放到“ BusinessObjects”文件夹下!在那里上课。同时,我担心创建一个新的类库,因为每个人都习惯于将一个类填充到单个库中。文件夹/命名空间可以工作。

4
一个类方法的数量限制是多少?
在我读过的不同设计书中,有时会着重强调类必须具有的方法数量(考虑OO语言,例如java或C#)。这些书中报道的例子通常非常简洁明了,但很少涉及“严重”或复杂的案例。 但是范围似乎在5到8之间。 在一个项目中,我开发了一个类别为“ Note”的类,其属性为属性:Title,Desctiption,CreateDate等。然后是一些基本方法,例如:getRelations(如果将注释分配给了不同的文档),getExpiryDate等。 但是,在开发应用程序时,需要更多的功能,因此需要更多的方法。 我知道,一个类拥有的方法越少,耦合就越松散。就模块化和可重用性而言,这确实是一个很好的优势,而且更易于编辑。 顺便说一句,如果在我们的上下文中不需要(甚至没有意义)创建子类,并且所有需要的功能都与该类相关,那么我们可以进一步附加几个方法? 我同意拥有15种以上的方法,然后可能需要重新设计。但是即使在那种情况下,如果删除某些方法或继承不是一个选择,那将是正确的方法吗?

4
用自动化测试改造遗留代码的最佳实践
我将承担在相对较大和较旧的代码库中重新实现已经定义的接口(一组C ++头文件)的任务。在执行此操作之前,我希望具有尽可能完整的测试范围,以便我可以尽早,轻松地检测到重新实现错误。问题在于,已经存在的代码库没有被设计为易于测试的,具有(非常大的)类和函数,高度的耦合,具有(很多)副作用的函数等。 听说以前有类似任务的经验,以及如何将自动测试(单元,集成,回归等)改造为旧代码的一些好的具体建议,将是很高兴的。
22 testing  legacy 

1
从开放源代码项目派生/重用代码的正确方法是什么?
假设我正在开发一个开放源代码项目,并且想重用另一个开放源代码项目中的琐碎实用程序功能(例如,文件搜索/替换功能)。复制功能并仅在文件顶部写一个小的版权声明是否合法?我应该在许可证中包括他们作为整个项目的版权所有者的名字吗? 同样,假设我叉了一个开源项目。我在哪里以及如何指定版权所有人和我本人之间共享版权? 我猜答案必须根据开放源代码许可证而有所不同,但我希望尽可能多地获得一个通用答案。 PS:我主要关注法律方面,但可以自由考虑您的道德观点。

16
为什么Java在这么多机构中是通用语言?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 编辑:这个问题起初似乎是在抨击Java,我想在这一点上有点。但是,我要提出的更大观点是,为什么选择任何一种语言作为最终目标都是所有问题的解决方案。Java恰好是使用过的Java,所以这是我在这里要击败的Java,但是我并不是故意将Java撕成一个新的:) 在大多数学术环境中,我都不喜欢Java。我并不是说语言本身很糟糕-它具有几个非常令人希望的方面,最重要的是能够在大多数平台上运行而无需重新编译。在您的下一个应用^ TM中使用语言没有错。(不是我个人会做的事情,但这更多是因为我对它的经验较少,而不是设计很差) 我认为使用Java作为语言来教授高级CS课程是一种浪费。我的许多共同学生无法编程,但该死的,因为他们不知道如何在非垃圾收集的世界中工作。他们从根本上不了解要为其编程的机器。当某人可以在垃圾回收世界之外工作时,他们可以在一个垃圾回收世界中工作,反之亦然。GC是一种工具,而不是拐杖。但是,它被用来教计算机科学专业的学生的方式是拐杖。 计算机科学不应教授针对一种语言的整套课程。学生们离开了,所有好的设计都是惯用的Java设计,而面向对象的设计是唯一可以做的唯一方法。其他语言,至少其中一种不是垃圾收集语言,应在教学中使用,以使毕业生更好地理解机器。 令人尴尬的是,拥有受人尊敬的机构在CS中拥有PHD的人无法从纸袋中编程出路。 更糟糕的是,当我与那些真正了解事物运作方式的计算机科学教授交谈时,他们会分享这样的感觉,即我们通过使用Java来做所有的事情对我们的学生不利。(请注意,如果我将其替换为任何其他语言,则上述内容将相同,通常是使用一种语言,而不是Java本身) 总的来说,我觉得我再也无法尊重任何程度的知识了-当我看不到周围的人能够摆脱Fizzbuzz问题的影响时,他们可以编程。 为什么/如何成为这种方式?

4
多少堆栈使用量过多?
最近,当我编写C或C ++时,我会在堆栈上声明所有变量,只是因为它是一个选项,与Java不同。 但是,我听说在栈上声明大的东西是个坏主意。 为什么会这样呢?我认为涉及到堆栈溢出,但是我不清楚原因为何。 堆栈上有多少东西太多了? 我不是想将100MB的文件放在堆栈上,而只是将十几个千字节数组用作字符串缓冲区或其他任何东西。这是堆栈使用过多吗? (对不起,如果有重复,搜索堆栈时会不断引用堆栈溢出。甚至没有调用堆栈标记,我只是使用了抽象标记。)


3
API与前端与后端之间的区别
我正在尝试编写一个“标准”商业网站。所谓“标准”,是指该站点在前端,后端(用于处理内容)运行常规的HTML5,CSS和Javascript,并在数据库中运行MySQL。这是一个基本的CRUD网站:前端几乎可以存储数据库中存储的所有内容;不论用户输入什么,后端都会将其写入数据库并进行一些处理。就像大多数网站一样。 创建我的Github存储库以开始编码时,我意识到我不了解前端后端和API之间的区别。解决我的问题的另一种方式是:API进入这张图片的位置是什么? 我将列出更多详细信息,然后列出我要提出的问题-希望这会使你们对我的实际问题有更好的了解,因为我很困惑,以至于我不知道要问的具体问题。 一些更多的细节: 我想尝试Model-View-Controller模式。我不知道这是否会改变问题/答案。 该API将是RESTful 我希望后端使用自己的API,而不是允许后端作弊并调用特殊查询。我认为这种风格更加一致。 我的问题: 前端是否调用调用API的后端?还是前端只是调用API而不是调用后端? 后端是否仅执行API,并且该API将控制权返回给后端(其中后端充当最终的控制器,委派任务)? 建议使用详尽详尽的答案来解释API与前端后端的作用。如果答案取决于编程模型(除Model-View-Controller模式以外的模型),请描述API的这些其他思考方式。谢谢。我很困惑

3
编写要求时应使用和必须使用的最佳实践
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 6年前。 我之前发送了一封电子邮件,提醒我们的开发人员,在派生的需求中使用“应”一词不应追随您的功能需求。在编写功能需求时,单词“必须”用于描述派生的需求必须执行的功能。 派生=系统应为功能正常=系统必须执行要求 它是由我们的一位前辈寄回的,这是错误的,应该在所有要求中使用。 我在这里错了吗?应该在所有要求中使用Shall。我还找不到任何东西可以支持它。

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.