软件工程

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

2
为什么继承,封装和多态性不是OOP的支柱?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 5年前关闭。 有一天,我去了一个Stack Overflow聊天室,看到一句话,它表明继承,封装和多态性是OOP的支柱(从某种意义上说,它们是基础,是唯一的构造)。 另外,还有一个类似的问题,在大学考试和工作面试中经常有人问我,正确的答案始终是问题标题中的声明(“是的,继承,封装和多态性是OOP的基础。 )。 但是在Stack Overflow聊天中,我被严重嘲笑,参与者强烈不同意这种说法。那么,这句话有什么问题呢? 在后苏联和美国的大学里,程序员似乎接受过不同的培训吗? 美国/英国程序员是否不将继承,封装和多态性视为OOP的支柱?

4
合并多个HTTP请求以节省带宽是否是一个好主意?
我正在准备一个单页应用程序,该应用程序有时会在缓慢的移动连接上使用。就API请求而言,它的某些部分相当繁重(为新的屏幕显示获取10个不同的资源)。 现在,将这些服务合并到提供所有必需数据的服务中,但是就REST原理而言不是“纯”的,这是一个好主意吗?是否会有可观的性能提升?
16 api  rest  http 

3
并非邪恶的软件货币化
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 5年前关闭。 到目前为止,我有一个免费的开源项目,下载量约为80万。因为我不希望工具栏恶意软件与我的软件相关联,所以一些货币化公司不时与我联系,并拒绝了它们。但是我在想,是否有一种非邪恶的方法来通过软件获利? 以下是我所知道的选项: 添加捐赠按钮。 我对此不太满意,因为我真的不需要“捐赠”-我的薪水很好。 捐赠用户可能有资格获得支持等(请参阅倒数第二个项目符号) 在您的应用程序内添加广告。 在网络上这是可以接受的,但是在桌面程序中,它看起来非常la脚。 每次下载收取少量费用。 这种模型在移动世界中很好用,但是我怀疑没人会在台式机上使用它。 尽管我认为我只能为二进制文件付费(大多数用户不会为编译源代码而烦恼),但它与开放源代码并不能很好地融合在一起。 人们在明确付款后可能会期望得到支持等(请参阅下一个项目符号)。 从与该计划相关的服务/社区/支持中赚钱。 我绝对不想走这条路,我不希望编码之外有任何麻烦。我向您保证,该程序是一流的(尽管很简单),并且到目前为止我还没有发现任何错误(有支持论坛和博客评论,用户可以在其中进行报告)。它也非常简单,有文档记录且易于发现,因此我认为我有理由按原样提供它。 向您的安装程序添加会员建议。 如果您使用获利公司,则会失去对他们提议的控制。除非您能与公司建立某种牢固的信任关系以提供质量建议(我对此表示怀疑),否则我将无法做到。 选择您自己的会员(例如直接建议Google工具栏)可能是我心中唯一可行的解​​决方案。问题是,在哪里可以找到可以真正为用户带来价值,而不是用垃圾软件感染用户计算机的可靠会员?我想也许是巴比伦(当然不是工具栏,我讨厌工具栏)?

4
在简单属性上使用AggressiveInlining有不利之处吗?
我敢打赌,如果我对分析C#/ JIT行为的工具有更多了解,我会自己回答,但是由于我不了解,请耐心询问。 我有这样的简单代码: private SqlMetaData[] meta; [MethodImpl(MethodImplOptions.AggressiveInlining)] private SqlMetaData[] Meta { get { return this.meta; } } 如您所见,我放入了AggressiveInlining,因为我认为应该对其进行内联。 我认为。不能保证JIT可以内联它。我错了吗? 做这种事情会损害性能/稳定性/任何东西吗?

7
程序员处理代码审查的最佳方法是什么?
我对代码审查非常陌生,但是在博士学位期间我已经编码多年了-这并不总是使您成为一名优秀的程序员! 如果审阅者更改了您的代码并逐行处理代码,如果您不同意该怎么办?有时,您做出了选择X,而审阅者将其更改为Y,您的脑海中就想到了Y,但由于不利因素而决定不这样做,但是审阅者断言那些不利因素并不重要。您应该说出您的分歧,还是只是不听对方的意见? 如果您不善于接受批评,并且审稿人是组织中的高级人员,那么这将很困难。防守太大可能是不好的。

8
用于函数式编程的心理模型或真实世界隐喻
是否有人对函数式编程有一个很好的思维模型或隐喻,可以引用现实世界中的某些东西? 直观的面向对象编程对我来说很有意义。有些东西具有属性,有时它们也可以对它们的属性(方法)进行填充或执行计算。(例如:汽车,造型,猫)。 我对函数式编程毫无恶意,并且我对辩论两者的优点不感兴趣。与面向对象编程一样,我只需要一个隐喻或思维模型即可使用。 在功能范式中进行编程有哪些好的心理模型或现实世界隐喻?关于由功能处理功能组成的功能的某些说明,使一个功能没有固定的位置来站立和思考。

2
Scala的特征如何避免“钻石错误”?
(注意:出于明显的原因,我在标题中使用了“错误”而不是“问题”。))。 我对Scala的Traits做了一些基础阅读。它们类似于Java或C#中的接口,但是它们确实允许方法的默认实现。 我在想:这难道不会引起“钻石问题”吗?这就是为什么许多语言首先避免多重继承的原因? 如果是这样,Scala如何处理呢?

5
展平重叠范围的算法
我正在寻找一种展平(拆分)可能重叠的数字范围列表的好方法。问题与以下问题非常相似:最快的分割重叠日期范围的方法,还有许多其他方法。 但是,范围不仅是整数,而且我正在寻找一种可以在Javascript或Python等中轻松实现的体面算法。 示例数据: 解决方案示例: 抱歉,如果这是重复的,但是我还没有找到解决方法。

2
如何使通用结构更有效率?
“通用构造”是顺序对象的包装器类,可使它线性化(并发对象的强一致性条件)。例如,这是来自Java [1]的一种经过修改的免等待构造,它假定存在一个满足接口的等待空闲队列WFQ(仅需要线程之间的一次性共识)并假定一个Sequential接口: public interface WFQ<T> // "FIFO" iteration { int enqueue(T t); // returns the sequence number of t Iterable<T> iterateUntil(int max); // iterates until sequence max } public interface Sequential { // Apply an invocation (method + arguments) // and get a response (return value + state) Response apply(Invocation …

6
为什么我们将私有成员函数放在标题中?
为什么我们将私有成员变量放在C ++标头中的答案是,必须在声明实例的位置知道类的大小,以便编译器可以生成可在堆栈中适当移动的代码。 为什么我们需要将私有成员放在标题中? 但是,是否有任何理由在类定义中声明私有函数? 替代方案本质上是pimpl惯用语,但没有多余的间接性。 这种语言的功能不仅仅是历史错误吗?
16 c++  history 

2
纯粹出于美学原因创建嵌套函数?
我一直想知道其他程序员对创建纯美学功能的想法有何看法。 假设我有一个处理大量数据的函数:Function ProcessBigData。说我需要几个处理步骤,仅适用于数据:Step1,Step2,Step3。 我在源代码中看到最多的普通方法是像这样编写注释: Function ProcessBigData: # Does Step1 Step1.. Step1.. #Does Step2 Step2.. Step2.. 我通常做的是,但由于同伴缺乏这种编码风格,总是感到不对劲: Function ProcessBigData: Function Step1: Step1.. Step1.. Function Step2: Step2.. Step2.. Step1() -> Step2() 我主要担心的是,这种样式在Javascript和Python中是否有缺点 我没有其他替代品吗?

3
对OOP中“抽象”的定义感到困惑
我试图理解OOP中“抽象”的定义。 我遇到了一些主要定义。它们都有效吗?其中之一错了吗?我很困惑。(我用自己的话重新写了定义)。 定义1: 抽象是从现实世界中获取一些对象并将其转换为编程术语的概念。如创建Human类,并给予它int health,int age,String name等性质,和eat()等方法。 定义2: 更一般的定义。抽象是一个概念,它发生在软件系统中涉及“使事情变得更加通用/简单/抽象”的任何地方。一些例子: 继承层次结构,其中较高的类更简单或更通用,并定义更通用和抽象的实现。而层次结构中的下层类则更为具体,并定义了更详细的实现。 使用封装从其他类中隐藏类的实现细节,从而使该类对外部软件世界更加“抽象”(更简单)。 定义3 另一个通用定义:抽象是将重点从事物的细节和具体实现转移到事物的类型(即类),可用的操作(即方法)等概念,从而使编程更简单,更通用,更抽象。(这可以在软件系统中的任何位置和任何上下文中发生)。例如,它在封装时发生,因为封装意味着隐藏实现的细节,仅显示事物的类型及其更笼统和抽象的定义。Anotehr示例将使用ListJava中的对象。该对象实际上使用a ArrayList或a 的实现细节LinkedList,但是此信息使用更通用的名称来抽象List。 这些定义是否正确?(我指的是最常规和公认的定义)。

6
从TDD的角度来看,如果我针对实时端点而不是模拟进行测试,那我是一个坏人吗?
我虔诚地遵循TDD。我的项目通常具有有意义的测试用例,测试覆盖率可达85%或更高。 我使用HBase进行了大量工作,而主要的客户端接口HTable实在令人难以接受。与编写使用实时端点的测试相比,编写我的单元测试要花3到4倍的时间。 从哲学上讲,我知道使用模拟的测试应优先于使用实时端点的测试。但是模拟HTable是一个严重的难题,我不确定它相对于针对实时HBase实例进行测试是否具有很多优势。 我们团队中的每个人都在其工作站上运行一个单节点HBase实例,而我们的Jenkins机器上运行着一个单节点HBase实例,因此这不是可用性问题。实时端点测试显然比使用模拟的测试花费更长的时间,但是我们并不在乎。 现在,我为我的所有类编写了实时端点测试和基于模拟的测试。我很想抛弃模拟游戏,但我不希望结果因此而下降。 你们怎么想

4
为什么不能轻松地反编译本机代码?
使用基于字节码的虚拟机语言(例如Java,VB.NET,C#,ActionScript 3.0等),有时您会听到,只需从Internet下载一些反编译器,并在其中运行字节码一次,这是多么容易,并且通常,您会在几秒钟内想到与原始源代码相差不大的内容。据说这种语言特别容易受到攻击。 最近,我开始想知道,为什么您至少不了解本机二进制代码最初是用哪种语言编写的(以及尝试将其反编译成哪种语言),却为什么对本机二进制代码却听不懂呢。很长一段时间以来,我发现这仅仅是因为本地机器语言比典型的字节码疯狂得多,而且更加复杂。 但是字节码是什么样的?看起来像这样: 1000: 2A 40 F0 14 1001: 2A 50 F1 27 1002: 4F 00 F0 F1 1003: C9 00 00 F2 本地机器代码是什么样(十六进制)?当然,它看起来像这样: 1000: 2A 40 F0 14 1001: 2A 50 F1 27 1002: 4F 00 F0 F1 1003: C9 00 00 F2 指令来自类似的思维框架: 1000: mov EAX, 20 …

5
如何避免过多的方法重载?
我们的应用程序源代码中有很多地方,其中一个类有许多具有相同名称和不同参数的方法。这些方法始终具有“上一个”方法的所有参数,再加上一个。 这是经过长期发展(遗留代码)和这种想法(我相信)的结果: “ 有一个方法M做A,我需要做A +B。好吧,我知道...我将向M添加一个新参数,为此创建一个新方法,将代码从M移到新方法使用一个以上的参数,在那儿执行A + B,然后使用新参数的默认值从M调用新方法。 ” 这是一个示例(类似于Java的语言): class DocumentHome { (...) public Document createDocument(String name) { // just calls another method with default value of its parameter return createDocument(name, -1); } public Document createDocument(String name, int minPagesCount) { // just calls another method with default value of its …

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.