软件工程

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

2
如何设计基于角色的访问控制?
我试图遵循基于角色的访问控制模型来限制用户在系统中可以执行或不能执行的操作。 到目前为止,我具有以下实体: 用户 -将使用该系统的人员。这里有用户名和密码。 角色 -用户可以拥有的角色的集合。诸如经理,管理员等 资源之类的东西-用户可以操纵的东西。像合同,用户,合同草稿等 操作 -用户可以使用资源执行的操作。像创建,读取,更新或删除。 现在,我在图中有这样关系的地方对此表示怀疑: 操作(0 .. *)在 资源(0 .. *)上执行,该资源生成一个名为权限的表,该表将存储该操作和资源。 权限表如下所示(它的一行): ID: 1,操作:创建,资源:合同。 这意味着许可,以创建一个合同。 我这样做是因为我觉得某些资源可能无法进行各种操作。例如,对于注册合同,用户可以上传文件,但是此操作不适用于注册提供商。 所以,现在当管理员将被赋予权限的角色,他不会有资源的清单,在系统中注册的每一个操作。 我认为每种资源都有自己的可以在他身上执行的操作的集合。 我可以澄清一下某些事情是无法理解的。 这是实施rbac的正确方法吗? 编辑 我的意思是,通过拥有一个包含操作和资源的权限表,我有了两个额外的表,因为我想将资源与操作相关联。我本来也可以完成资源具有权限的权限,权限表将存储这些权限。 但是然后发生的是,当管理员分配资源时,某些权限甚至对于某些资源都不存在。 因此,我想从数据库设计的角度来了解具有一个列操作和另一个资源的表权限是否正确?如果这样下去我会遇到问题吗?

5
使用Func代替IoC接口
上下文:我正在使用C# 我设计了一个类,为了隔离它并使单元测试更容易,我传入了它的所有依赖关系。它在内部没有对象实例化。但是,不是引用接口来获取所需的数据,而是让它引用通用的Funcs返回所需的数据/行为。当注入其依赖项时,我可以使用lambda表达式来实现。 对我来说,这似乎是一种更好的方法,因为在单元测试期间我不必做任何繁琐的模拟。另外,如果周围的实现有根本变化,则只需要更改工厂类即可;无需更改包含逻辑的类。 但是,我之前从未见过IoC这样做,这使我认为我可能会缺少一些潜在的陷阱。我唯一想到的是与未定义Func的C#早期版本的轻微不兼容,在我看来,这不是问题。 使用泛型委托/高阶函数(例如Func for IoC),而不是使用更具体的接口时,是否存在任何问题?

4
有关类型映射和扩展方法的最佳实践
我想问一些有关映射类型和在C#中使用扩展方法的最佳实践的问题。我知道这个主题在过去几年中已被讨论过多次,但是我读了很多帖子,但仍然有疑问。 我遇到的问题是扩展具有“转换”功能的类。假设我有“ Person”类,该类表示将由某些逻辑使用的对象。我还有一个“客户”类,代表来自外部API的响应(实际上会有多个API,因此我需要将每个API的响应映射到常见类型:Person)。我可以访问两个类的源代码,并且理论上可以在那里实现我自己的方法。我需要将客户转换为人,以便可以将其保存到数据库。该项目不使用任何自动映射器。 我有4种可能的解决方案: Consumer类中的.ToPerson()方法。这很简单,但是对我来说似乎是在打破“单一责任”模式,尤其是Consumer类也映射到其他类(某些其他外部API要求),因此它需要包含多种映射方法。 Person类中的构造函数,以Consumer为参数。也很容易,似乎也打破了单一责任模式。我需要有多个映射构造函数(因为将有另一个API的类,提供与Consumer相同的数据,但格式略有不同) 具有扩展方法的Converters类。这样,我可以为Consumer类编写.ToPerson()方法,并且当另一个API与其自身的NewConsumer类一起引入时,我可以编写另一个扩展方法并将其全部保存在同一文件中。我听过一种意见,即扩展方法通常是邪恶的,仅在绝对必要时才应使用扩展方法,这就是使我受挫的原因。否则我喜欢这个解决方案 转换器/映射器类。我创建了单独的类来处理转换并实现将源类实例作为参数并返回目标类实例的方法。 综上所述,我的问题可以简化为问题的数量(全部与我上面所述的内容相关): 是否将转换方法放入(POCO?)对象中(例如Consumer类中的.ToPerson()方法)是否被视为打破单一责任模式? 在(DTO类)类中使用转换构造函数是否被视为打破单一责任模式?尤其是如果可以从多种源类型转换此类,那么是否需要多个转换构造函数? 在访问原始类源代码的同时使用扩展方法是否被视为不良做法?这样的行为可以用作分隔逻辑的可行模式吗?还是反模式?

2
Optionals和Nullable类型有什么区别
斯威夫特有Optionals。C#具有Nullable类型。 据我所知,它们具有相同的用途,除了某种类型的值外,它们还存储变量是否有值或未定义(未初始化)的信息。 问题是Optionals仅仅是Nullable名称不同的类型,还是其他概念上的区别? 换句话说,在谈论概念本身时,或者在没有Optionals或的语言的上下文中,Nullables使用术语是否重要? 当用语言实现该功能时,我是否键入类型Optionals<T>或名称都很重要Nullable<T>

5
在.NET应用程序之间共享代码的最有效方法是什么?
在我们的工作中,我们有几个不同的.net应用程序,它们共享许多基本功能。我们已经使用干净的n层体系结构构建了这些应用程序,但是到了那一刻,我们意识到我们已经在不同的时间重新实现了相同的功能。显然这违反了DRY,我们希望对此进行更正。我们已经使用Nuget成功实现了通用粘合代码(连接IoC,日志记录,设置),但是我们也希望在所有应用程序之间共享数据和业务层。想法是,UI仅处理其实际需要的业务层部分。 起初这似乎是一个直截了当的问题,但是持续的开发可能会带来一些陷阱,我们不确定如何进行。假设我们建立了一个业务层来全部统治。为简便起见,我将其称为“基金会”。我们将我们的应用程序移植为使用Foundation,并且一切都很好。该基金会通过nuget分发给轻量级UI层,我们看起来很好。但是随后我们开始向应用程序中添加功能,并且遇到了麻烦。 假设我们正在开发Project A,并且添加了一项需要更改Foundation的新功能。我们对基础(Foundation-A)进行更改,并将它们作为不稳定的程序包推送到nuget提要。项目A获得了最新的nuget包,一切都很好。同时,另一位开发人员正在开发ProjectB。他从源代码控制中获得了最新的Foundation,但从一个稳定的分支中获取了最新的Foundation,因此它没有Project A的更改。他进行了更改并创建了Foundation-B。一切都很好。但是随后我们发现,Foundation-A和Foundation-B实施功能实际上可以共享代码,因此我们将它们组合在一起。同时,Foundation-C本身也有自己的变化。最终,Foundation-B可以投入生产,因此我们将其推出。但是然后我们需要更新生产A,B, 这似乎可行,但是我们担心使用不同的数据库模式,并使Foundation信息库的各个分支以及Project A,B和C信息库之间的所有内容保持同步。似乎可能需要大量的手动工作,这可能会出现错误。我希望这尽可能自动化。 这是我们使用的堆栈:C#,具有持续集成功能的TFS,Nuget。我们的应用程序是所有类型的ASP.NET应用程序。如果这会使事情变得更容易,我们愿意研究不同的SCM。 我正在寻找使Nuget对我们不同的源代码分支保持理智的方法。我们不想意外地将开发代码推入生产环境,因为我们引用了错误的Nuget包。

2
如何防止我的可执行文件被AV视为恶意软件或病毒?
我正在创建一个软件,该软件将在Windows上运行,并像游戏的启动器一样,充当客户端PC中的自动更新程序和文件验证程序。 我不明白的一件事是,为什么我的防病毒软件(Avast)认为我的exe文件很危险,并且在不要求将其放入沙箱中以安全使用的情况下不会启动它。 我的软件有没有应遵守的规则,被视为良好的规则,还是应该为某些数字签名和其他东西支付数百美元? 我在MS Visual Studio 2010中使用C#。 VirusTotal报告。使用WebClient()类,不进行DLL注入,可用作远程文件下载器。 并不是像它警告病毒一样,而是“建议”将其沙箱化。看截图:

3
干净的体系结构-用例类太多
我将进入Clean Architecture,将Android的级别从MVC提升到MVP,使用Dagger 2引入DI,使用RxJava 2引入反应性,当然还使用Java 8。 在MVP干净架构中,实体(在数据存储区中)与应访问它们的演示者之间存在一层。该层是“用例”。用例最好是一个接口,它对一个实体执行一个操作。 我还知道,Clear Architecture 是“尖叫中的 ”,就其项目而言,由于它们中的类很多,因此其可读性很高。 现在,在我的项目中,我有大约6个不同的实体,当然,每个实体存储库都有至少4种方法(通常是get,add,delete,update)来访问它们。. 因此,6 * 4 = 24。 如果我到目前为止对Clean Architecture的了解,我将有24个UseCase。 如果与MVC中的6个控制器相比,这是很多类。 我真的需要制作24个用例吗? 我真的很感谢有人成功使用它所做的澄清。 谢谢,杰克
15 java  android  use-case  mvp 

1
文件名的非扩展部分的名称是什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 给定文件路径: /some/path/abc.txt 该文件名是“的abc.txt”,而扩展名为“txt”。 什么是“行业标准”,“ abc”部分的明确名称? 作为参考,在Java的较早java.io和较新的java.nio库中,filename均表示“ abc.txt”,并且“ abc”部分没有术语(即库API不支持)。

3
找不到资源时,我应该返回204或404响应吗?
我正在为比赛和日程表开发一个简单的RESTful服务。通过包含JSON正文的POST请求创建锦标赛时,会将锦标赛插入,BiMap在DAO实现中声明如下: private BiMap<String, Tournament> tournaments = Maps.synchronizedBiMap(HashBiMap.create()); 创建锦标赛时,将返回其关联的字符串ID,以便用户将来可以参考该锦标赛。他/她可以从执行以下请求的新锦标赛中获取信息: GET http://localhost:8080/eventscheduler/c15268ce-474a-49bd-a623-b0b865386f39 但是,如果找不到具有此类ID的锦标赛怎么办?到目前为止,我将返回204响应。好吧,泽西岛null从其中一种方法返回时正在为我做这件事。这是与上述路线相对应的方法: @Path("/{id}") @GET @Produces(MediaType.APPLICATION_JSON) public Tournament getTournament(@PathParam("id") String id) { Optional<Tournament> optTournament = tournamentDao.getTournament(id); if (optTournament.isPresent()) return optTournament.get(); return null; } 我的问题是:可以返回204: No Content响应,还是应该返回404响应,因为找不到资源? 如果我应该将其更改为404,则会出现一个明显的问题:我应该更改方法签名吗?由于现在Tournament可能不会返回(类型为)锦标赛,因此方法应该看起来有所不同。我应该使用该Response类型作为返回类型吗?
15 java  rest  web-services  http 


2
在哪里推动失败的测试?
我只是更改了GitHub存储库上的分支设置,所以我的[下一个]分支需要通过pull请求传递一个CI构建。 随后与许多团队成员进行了关于测试失败的讨论。 为了上下文... 该仓库有一个[大师]分支,只有PR'd成时,有一个释放,使[大师]包含代码为的最后一个版本,无论它是否是一个重大的,未成年人,修补程序,β,α-/预发行版本。 [next]分支是“默认”分支,我们打算保留“发布就绪”代码;从技术上讲,可以随时将该分支公诸于[master]并发布。 每个fork都有自己的dev分支,并为[next]贡献者PR。 当我审阅不重要的PR时,我会将贡献者的dev分支合并到我的“ review”分支中,如果我发现可以快速修复的问题,则将提交/推送更改以及新的(有时会失败)测试和PR返回贡献者的dev分支;当他们合并我的更改时,使新的失败测试通过,然后推送,它们的PR进行同步,然后将PR合并到[next]中。 但是这个问题不是关于通过测试,而是关于失败的测试。 测试失败记录了需要解决的问题。 已知的bug应该编写测试,以便我们知道什么不起作用。 从技术上讲,GitHub 问题列表(针对错误和/或关键 标签进行了过滤)也可以做到这一点。它是一个很好的做法,也有一堆失败的测试文档的bug? 在[next]上失败的构建意味着我们还没有准备好发布……但是,“准备发布”有点像“准备好”要孩子了-您从没有为此做好充分的准备,并且某些地方(重要性不一)将不可避免地出问题。 因此,我们只是将通过测试推向[next]。那么,将失败的测试推向何处呢?我的意思是,在PR /审查流程之外? 例如,一个用户在问题列表中报告了一个新错误,我想为其编写一个失败的测试套件-以便指定需要执行的操作以及在何处进行操作,这使新贡献者更容易上手最终PR修复。 我应该在哪里推动这些失败的测试?还是将失败的测试推送到任何地方甚至是个好主意?

4
用于内部业务应用程序的Windows Installer有意义吗?
我正在尝试对这种情况下的普遍性建立一个普遍的了解,以便我可以决定进一步进行下去是否有意义。 在具有以下特征的典型公司环境中是否欢迎安装程序? 变更控制程序 开发/质量保证/生产环境 在各个领域(防火墙,数据库,窗口等)的指定部署团队。 是否可以将“石蕊试纸”应用于应用程序,以查看它是否是创建安装程序的理想选择?* 安装程序是否足够简单,每个应用程序都应该有一个? 安装人员甚至是正确的工具吗? 期望开发人员学习诸如WiX之类的东西来支持安装程序是否合理? 一般而言,可维护性是一个问题,例如,创建安装程序是否是利基技能? * 例如,我在生产服务器上的共享目录中有一组winform应用程序。特定的组可以从此目录运行应用程序,但是只有系统管理员才能修改可执行文件。当前的部署过程包括让管理员将可执行文件和库复制/粘贴到共享目录。 由于应用程序未安装在个人用户的计算机上,因此创建一个安装程序以将这些应用程序的新版本部署到共享目录是否有意义? 编辑 - 我觉得这里的答案提供了扎实的建议,所以我想分享我为当前项目提出的想法,在这个项目中我需要构建大量应用程序并将它们部署到单个文件夹中。 我找到了一个名为_PublishedApplications的NuGet程序包,该程序包模仿了Web项目的_PublishedWebsites的行为。想法是将NuGet软件包安装到项目中,并添加一个目标,该目标会将构建工件复制到输出路径中的_PublishedApplications目录中。通过从命令行运行MSBuild并指定outdir属性来激活此行为: msbuild /p:Configuration=Release /p:outdir=C:\path\to\outdir MySolution.sln 这将为您提供类似于以下内容的目录结构: C:\ path \ to \ outdir _PublishedApplications \ 专案1 \ dlls, exes, etc. 专案2 \ ... 从那里创建一个可以在各种环境中提取的zip相当简单。

3
我可以使用Unicode哨兵值吗?
我正在设计一种文件格式,所以我想正确地做。既然是二进制格式,该文件的第一个字节(或字节)应不形成有效的文本字符(就像在PNG文件头1)。这使得无法识别格式的工具通过查看前几个字节仍然可以看到它不是文本文件。 上面的任何代码点0x7F都是无效的US-ASCII,因此很容易。但是对于Unicode则完全不同。除了有效的Unicode字符有私用字符,noncharacters和哨兵,我在发现Unicode的私用字符,Noncharacters和哨兵常见问题解答。 我可以在文件开头使用什么样的前哨字节序列,从而导致无效的US-ASCII,UTF-8,UTF-16LE和UTF-16BE? 显然,第一个字节不能具有低于0x80此值的值,因为该值将是有效的US-ASCII(控制)字符,因此0x00无法使用。 另外,由于专用字符是有效的Unicode字符,所以我也不能使用这些代码点。 由于它必须同时使用Little-endian和Big-endian UTF-16,因此也不能使用非字符,0xFFFE因为其反向0xFEFF是有效的Unicode字符。 上面提到的常见问题解答建议不要使用任何非字符,因为这仍然会导致有效的Unicode序列,因此,类似的东西0xFFFF也无法使用。 让我使用的面向未来的前哨值是什么? 1)PNG格式的第一个字节为非ASCII 0x89值,其后为字符串PNG。读取PNG的前几个字节的工具可能会确定它是二进制文件,因为它无法解释0x89。另一方面,GIF文件直接以有效且可读的ASCII字符串GIF开头,后跟另外三个有效ASCII字符。对于GIF,工具可能会确定它是可读的文本文件。这是错误的,并且以非文本字节序列启动文件的想法来自Andy McFadden的“ 设计文件格式”。
14 unicode 

8
为什么要用C ++编写编译器?
我想知道为什么C ++是编写编译器的好选择。当然,C对此也有好处,因为许多编译器都是用C或C ++编写的,但是这次我对C ++更加感兴趣。有什么好的理由吗?我一直在互联网上寻找该信息,但找不到任何好的理由。
14 c++  compiler 

8
您在压力下会写不好的代码吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 7年前关闭。 当您承受压力时,临近最后期限,经理正在喘不过气来,您是否发现自己开始编写不良代码?为了完成任务,TDD和最佳做法会顺道溜走吗?在这种情况下您会怎么做?您的经历是什么?
14 bad-code 

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.