软件工程

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

2
JWT的有效载荷中应包括访问权限和角色吗?
JWT是否应包含有关客户端的权限和角色的信息? 在JWT令牌中具有此类信息将非常有用,因为每次有有效令牌出现时,都将更容易提取有关用户权限的信息,并且无需为此调用数据库。但是,将这样的信息包括在数据库中而不对它们进行仔细检查是否会带来安全问题? 要么, 诸如上述信息之类的信息不应成为JWT的一部分,而应该仅使用数据库来检查用户的访问角色和权限?

1
用于推断类型参数的类型参数的技术名称?
设置:假设我们有一个名为type的类型Iterator,该类型具有type参数Element: interface Iterator<Element> {} 然后我们有一个接口Iterable,该接口具有一个将返回的方法Iterator。 // T has an upper bound of Iterator interface Iterable<T: Iterator> { getIterator(): T } Iterator泛型的问题是我们必须为其提供类型参数。 解决此问题的一种方法是“推断”迭代器的类型。以下伪代码表达了这样的想法:存在一个类型变量Element,该类型变量被推断为Iterator: interface <Element> Iterable<T: Iterator<Element>> { getIterator(): T } 然后我们在这样的地方使用它: class Vec<Element> implements Iterable<VecIterator<Element>> {/*...*/} 这个定义在其定义中Iterable没有使用Element任何其他地方,但在我的实际用例中却使用了。使用的某些函数Iterable还需要能够约束其参数以接受Iterables,该s仅返回某些迭代器,例如双向迭代器,这就是为什么返回的迭代器被参数化而不是元素类型的原因。 问题: 这些推断的类型变量是否有确定的名称?整个技术呢?由于不知道特定的术语,因此很难在野外搜索此示例或了解特定于语言的功能。 并非所有具有泛型的语言都具有此技术;这些语言中有类似技术的名称吗?

2
异常的粒度
我和几个朋友之间进行了辩论。他们更喜欢一般性例外,例如作为例外的字段ClientErrorException并ServerErrorException有详细信息,而我更喜欢使事情更具体。例如,我可能有一些例外,例如: BadRequestException AuthenticationFailureException ProductNotFoundException 这些都是基于API返回的错误代码构建的。 遵循异常的优点,这对于Java来说似乎是惯用的。但是,我朋友的意见并不少见。 就代码可读性和API可用性而言,是否存在首选方法,或者它真的只是偏爱首选项?

6
如何与大学生一起实施发展过程
在我作为软件开发人员的第一份工作中,我的团队使用敏捷/混乱来管理我们的项目工作流程,并且效果很好。我有一些经验丰富的导师,他们使我走上了正确的道路-我欠他们很多谢意。我在那里工作了几年,然后在几个月前搬到了一个新的机会。 快进我目前的工作。我在大学的教授指导下工作。自从我上大学以来,几乎每个程序员都是学生(他们很便宜而且很多!)我的老板有管理经验,但是没有软件开发经验,并且软件团队并不总是站在我老板的头脑中。这些条件已经创造了完美的环境,创造了一些非常差质量的软件。软件项目似乎有些无赖,没有设计思想,并且采用了一些真正令人恐惧的做法。我知道情况会更好。 我想实现一个开发过程,以帮助每个人步入正轨,提高代码质量,并部署更稳定的软件。我只是不确定从哪里开始。 可以说,我不是在寻找诸如“使用Scrum”,“设置看板”或“看看敏捷!”之类的答案!(尽管对此表示赞赏)。更具体地说,我希望深入了解如何为该工作环境实施开发过程。员工通常在上班之前工作1至2年,通常没有经验,几乎不可能安排包括每个人在内的日常站立会议。 在这样的工作场所如何提高质量,效率和沟通能力? 更新:阅读了一些答案和评论后,我想我还会提供一些其他背景知识。 我不认为自己在艺术软件开发的高手,但我很足够的经验来识别不好的编程当我看到它。在花一两分钟与他们合作之后,我可以确定开发人员是否才华横溢。我很舒服,我自己的能力,以找到一种方法来解决问题巧妙,然而,在我实在缺乏经验的面积是项目管理,而其他开发人员参与(这就是为什么我在这里问你的精彩人民的建议)。 我听起来像是进入这个办公室的每个学生都是一个完全昏昏欲睡的人。这里有些坏蛋,但是我遇到的大多数学生都是聪明的,想学习的,并对工作充满热情。有些人才刚刚起步,他们不知道自己不知道什么。没关系。刚开始编程时,我的生活就再好不过了!

6
如果我的对象是可变的,在函数式编程的上下文中会出什么问题?
我可以看到可变对象与不可变对象(如不可变对象)的好处,消除了由于共享和可写状态而导致的多线程编程中的许多疑难解答问题。相反,可变对象有助于处理对象的身份,而不是每次都创建新的副本,因此特别是对于较大的对象,还可以提高性能和内存使用率。 我想了解的一件事是,在函数式编程的上下文中拥有可变对象可能会出错。像告诉我的要点之一是,以不同顺序调用函数的结果不是确定性的。 我正在寻找一个真正的具体示例,其中很明显在函数编程中使用可变对象会导致什么问题。基本上,如果它不好,那么不管是面向对象还是功能编程范例都不好,对吗? 我相信,在我自己的发言下面,我可以回答这个问题。但是我仍然需要一些例子,以便我能更自然地感受到。 OO通过诸如封装,多态等工具帮助管理依赖性并编写更容易维护的程序。 函数式编程也具有促进可维护代码的动机,但是通过使用样式消除了使用OO工具和技术的需要-我认为其中之一是通过最小化副作用,纯函数等。

3
如果反模式
我在此博客上阅读了有关“如果-如果反模式”的信息,但我不确定我是否理解为什么它是反模式。 foreach (string filename in Directory.GetFiles(".")) { if (filename.Equals("desktop.ini", StringComparison.OrdinalIgnoreCase)) { return new StreamReader(filename); } } 问题1: 是因为return new StreamReader(filename);里面for loop吗?还是for在这种情况下不需要循环的事实? 正如博客作者所指出的那样,这种方式的疯狂程度较小: if (File.Exists("desktop.ini")) { return new StreamReader("desktop.ini"); } 两者都处于竞争状态,因为如果在创建之前删除文件StreamReader,您将得到一个File­Not­Found­Exception。 问题2: 要修复第二个示例,您是否要在不使用if语句的情况下重新编写它,而是StreamReader使用try-catch块将其包围,并且如果引发了File­Not­Found­Exception您在该catch块中进行相应的处理?

5
微服务:MonolithFirst?
我一直在研究微服务体系结构,以期全面了解所有优缺点,何时何地为什么。等等。我正在阅读/观看的许多信息都来自ThoughtWorks(Martin Fowler,Neal Ford等)。 al)。 马丁·福勒(Martin Fowler)在该主题上的大部分工作都还存在数年,那时微服务(如果不是一般实践,在编程中是家喻户晓的名字)还很年轻,因此,我对其中的大部分内容持保留态度。 特别要注意的是: 当我听到有关使用微服务架构的团队的故事时,我注意到了一种常见的模式。 几乎所有成功的微服务故事都始于一个庞大的整体,并且被分解了 在几乎所有我听说过从头构建为微服务系统的系统的情况下,它都遇到了严重的麻烦。 这种模式使我的许多同事争辩说,即使您确定应用程序足够大,也值得这样做,但您不应该使用微服务启动新项目。。 (参考:https : //martinfowler.com/bliki/MonolithFirst.html-强调他们的) 现在,三年后的今天,微服务这个词更普遍了,人们普遍同意一个新系统通常可以通过拥有更大(比微服务大但比整体式小)的服务块来更好地服务,并且作为进化措施的一部分,它们是否更细化? 或者,与上述陈述相比,是否有规范从头开始使用粒度微服务架构开始项目? 似乎是理智的一般方法,但对社区的思想感到好奇。

3
是否有理由不修改按值传递的参数的值?
是否有客观的,可支持的软件工程论据来支持或反对在函数主体中修改按值参数的值? 我团队经常发生的争吵(主要是很好玩)是是否应修改按值传递的参数。团队中的几个成员坚决决不应该将参数分配给它们,以便始终可以查询最初传递给该函数的值。我不同意并认为参数不过是通过调用方法的语法初始化的局部变量。如果按值参数的原始值很重要,则可以声明局部变量以显式存储该值。我不相信我们两个人都能很好地支持我们的立场。 这是无法解决的宗教冲突,还是在任一方向上都有好的客观的软件工程理由? 注意:原则问题仍然存在,无论特定语言的实现细节如何。例如,在JavaScript中,参数列表始终是动态的,参数可以视为从arguments对象初始化局部变量的语法糖。即使这样,也可以将参数声明的标识符视为“特殊”标识符,因为它们仍然捕获信息从调用者到被叫者的传递。

5
长方法重构:保持原样vs分离方法vs使用局部函数
假设我有这样长的方法: public void SomeLongMethod() { // Some task #1 ... // Some task #2 ... } 此方法没有任何重复的部分,应将其移至单独的方法或局部函数。 有很多人(包括我在内)认为长方法就是代码的味道。我也不喜欢#region在这里使用(s)的想法,并且有一个非常受欢迎的答案来解释为什么这很糟糕。 但是如果我将此代码分成方法 public void SomeLongMethod() { Task1(); Task2(); } private void Task1() { // Some task #1 ... } private void Task2() { // Some task #1 ... } 我看到以下问题: 用一个方法内部使用的定义来污染类定义范围,这意味着我应该在某个地方进行文档记录,Task1并且Task2只供内部使用SomeLongMethod(否则,每个阅读我的代码的人都必须推断出这个想法)。 污染将仅在单个SomeLongMethod方法中使用一次的方法的IDE自动完成功能(例如Intellisense)。 因此,如果我将此方法代码分成本地函数 …

3
如果出现解析错误,我将如何设计提供详细信息的TryParse方法?
解析用户输入时,通常建议不要抛出和捕获异常,而应使用验证方法。在.NET BCL中,这将是例如int.Parse(在无效数据上引发异常)和int.TryParse(返回false无效数据)之间的区别。 我正在设计自己的 Foo.TryParse(string s, out Foo result) 方法,我不确定返回值。我可以用bool像.NET自己的TryParse方法,但不会给有关指示类型的错误,有关的确切原因,为什么 s不能被解析成Foo。(例如,s括号可能不匹配,或者字符数错误,或者Bar没有对应的Baz等)。 作为用户的API,我强烈不喜欢它就会返回一个成功/失败布尔瞒着我的方法为什么操作失败。这使得调试猜测游戏成为可能,我也不想将其强加给图书馆的客户。 我可以想到很多解决此问题的方法(返回状态代码,返回错误字符串,将错误字符串添加为out参数),但是它们都有各自的缺点,我也想保持与.NET Framework。 因此,我的问题如下: .NET Framework中是否存在与简单的true / false布尔值相比,(a)解析输入而不抛出异常,并且(b)仍返回更详细的错误信息的方法?
9 c#  .net  api-design 

5
遵循我所知道的路径,然后尝试实施正确的编码实践,还是从良好的编码实践开始,并尝试弄乱我的方法?
首先,我想说我习惯于做过程编程,这是我的爱好-我正在尝试用几种语言学习OOP,并了解理论,而不是实践。 我有一个我想构建的宠物项目,特别是在带有数据库后端的PHP中(根本不在乎哪个)。我的主要原因是该应用程序可以在任何设备上使用,因此WebApp似乎是合乎逻辑的选择。 我了解要构建可维护的PHP WebApp,应使用OOP,类,框架,库等。这听起来很合逻辑,因此我决定尝试一些流行的应用程序。但是,在整个周末都只是尝试它们并尝试阅读教程之后,试图将这些教程适应我的小项目,我既困惑又沮丧。 我决定(主要是为了进行概念验证)在另一个程序(Microsoft Access)中构建该应用程序,并在短短几个小时内实现了我的主要目标-除了Web部件。 我的问题是,我应该遵循我所知道的道路,然后尝试实施正确的编码实践,还是应该从良好的编码实践入手,并尝试弄乱自己的方式?对于这个项目,我希望它可以在GitHub上开源,因此我将对使用和更改我的代码的其他人开放,但是我也知道,如果代码编写不当,将很难聚集编码人员来提供帮助。

4
环境上下文与构造函数注入
我有很多核心类,它们需要数据库的ISessionContext,用于日志的ILogManager和用于与其他服务进行通信的IService。我想对所有核心类使用的此类使用依赖项注入。 我有两个可能的实现。接受所有三个类的IAmbientContext或为所有三个类注入IAmbientContext的核心类。 public interface ISessionContext { ... } public class MySessionContext: ISessionContext { ... } public interface ILogManager { } public class MyLogManager: ILogManager { ... } public interface IService { ... } public class MyService: IService { ... } 第一个解决方案: public class AmbientContext { private ISessionContext sessionContext; private ILogManager …

2
正确的设计可以避免使用dynamic_cast?
经过一些研究,我似乎找不到一个简单的例子来解决我经常遇到的问题。 假设我要创建一个小应用程序,可以在其中创建Squares,Circles和其他形状,将它们显示在屏幕上,在选择它们后修改其属性,然后计算其所有周长。 我会像这样做模型类: class AbstractShape { public : typedef enum{ SQUARE = 0, CIRCLE, } SHAPE_TYPE; AbstractShape(SHAPE_TYPE type):m_type(type){} virtual ~AbstractShape(); virtual float computePerimeter() const = 0; SHAPE_TYPE getType() const{return m_type;} protected : const SHAPE_TYPE m_type; }; class Square : public AbstractShape { public: Square():AbstractShape(SQUARE){} ~Square(); void setWidth(float w){m_width = w;} …

1
如何将DDD的某些概念应用于实际代码?里面的具体问题
我一直在研究DDD,目前正在努力寻找一种在实际代码中应用这些概念的方法。我在N层有大约10年的经验,所以我苦苦挣扎的原因很可能是我的思维模型与该设计太过相关。 我创建了一个Asp.NET Web应用程序,并从一个简单的域开始:Web监视应用程序。要求: 用户必须能够注册一个新的Web App进行监视。该Web应用程序具有友好的名称并指向URL。 该网络应用将定期轮询状态(在线/离线); 该Web应用程序将定期轮询其当前版本(该Web应用程序应具有“ /version.html”,这是一个在特定标记中声明其系统版本的文件)。 我的疑虑主要涉及责任分工,为每件事情找到适当的位置(验证,业务规则等)。在下面,我编写了一些代码,并添加了有关问题和注意事项的注释。 请批评指教。提前致谢! 领域模型 旨在封装所有业务规则。 // Encapsulates logic for creating and validating Url's. // Based on "Unbreakable Domain Models", YouTube talk from Mathias Verraes // See https://youtu.be/ZJ63ltuwMaE public class Url: ValueObject { private System.Uri _uri; public string Url => _uri.ToString(); public Url(string url) …

3
是否手动编写单元测试示例验证?
我们知道编写JUnit测试可以演示代码中的一条特定路径。 我的一位同事评论说: 手动编写单元测试是“ 通过示例证明”。 他来自具有诸如Quickcheck之类的工具的Haskell的背景,并且具有推理类型程序行为的能力。 他的意思是,此方法未尝试使用许多其他输入组合,而您的代码并未经过测试。 我的问题是:手动编写单元测试示例验证吗?

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.