问题标签 [abstraction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
431 浏览

abstraction - 抽象与否?

前几天,我偶然发现了 Linus Torwalds 的一篇相当古老的 usenet 帖子。当他为自己选择使用纯 C 语言而不是更现代的东西进行辩护时,这是臭名昭著的“你充满了公牛****”的帖子。

特别是这篇文章让我想到了在我工作的地方积累了大量的抽象层。我的是一个 Windows .Net 环境。我必须说我喜欢 C# 和 .Net 环境,它确实让大多数事情变得简单。

现在,我来自一个非常不同的背景,由 Unix 技术(如 C 和过多或脚本语言)组成;对我来说,OOP 只是一种,并不总是最好的编程范式。我经常(以一种工作方式,当然!)与我的同事(尤其是一个)斗争,因为他们似乎是“任何问题都可以通过额外的抽象层次来解决”教会,而我更多的是“保持简单”的学校。我认为对于可能来自不同文化的问题,有一种非常不同的心理方法。

作为一个非常简单的示例,对于我在这里所做的第一个项目,我需要为应用程序进行一些配置。我制作了一个 10 行的类来加载和解析一个 txt 文件,该文件位于程序的根目录中,其中包含冒号分隔的键/值对,每行一个。有效。

最后,为了标准化配置问题的方法,我们现在在每台运行每个配置程序的机器上都有一个库,该程序调用一个服务,在启动时,加载一个包含对其他 xml 的引用的 xml,一个每个应用程序,其中包含配置本身。

现在,它是可扩展的,由花哨的可重用抽象、提供程序和所有组成,但我仍然认为,如果有一天我们真的碰巧重用了它的一部分,随着时间的推移,我们可以制作所需的代码从开始或复制/过去旧代码并修改它。

你对此有什么想法?你能指出一些有趣的参考来处理这个问题吗?

谢谢

0 投票
1 回答
3177 浏览

winforms - 在 WinForms MDI 中使用具有存储库模式的实体框架

我们即将启动一个与前一个项目类似的新项目。我可以复制旧设计,但我对旧设计不太满意。

它是建立在 .Net 3.5 (Winforms MDI) 之上的“标准”业务系统(销售、盘点、仓储等),后端有实体框架。

所有表单都继承自基本表单(继承 Windows.Form)。该表单公开了一个名为 ObjectContext 的属性,该属性在第一次调用时会实例化一个新的 ObjectContext。我认为这构成了一个非常好的 UnitOfWork,在每种形式中都隔离了所有数据访问。

然而。

我已将所有查询和常见的 CRUD 封装在“可怜的人存储库”中。这些存储库作为 ObjectContext 的属性公开。

因此,如果我想绑定并订购一个表单,我会调用 OrderLinesGrid = ObjectContext.OrderRepository.GetOrderLinesByID(orderID)。

OrderRepository 获取对为表单创建的 objectcontext 的引用,如下所示

(在我的部分 ObjectContext 类中)

我不喜欢的是:

  1. 对存储库的调用是通过 ObjectContext 进行的。因此,我没有得到我想要的查询和数据访问层之间的抽象。

  2. 对于我的域中的每种新类型,我需要在我的 ObjectContext 中创建一个属性

我对 OrderRepository 的调用应该只返回域对象,而不用担心它是如何持久化的。此外,我不能让每个存储库都有它自己的 ObjectContext,因为这需要我在将 Country 引用到 Order.Country 属性时附加和分离对象。

我将不胜感激有关此设计的任何想法和反馈 :)

0 投票
5 回答
82 浏览

c# - 表单对象问题

对于表单对象应该处理哪种代码而不是让对象本身处理它,是否有人有任何硬性规定?例如,如果有一场比赛,那么正在比赛的对象是否应该说马,将比赛作为马的一部分来处理,还是将其放在表单对象中更好?我想我要问的是如何决定什么进入像马这样的对象作为方法,以及进入表单对象而不是马。在这种情况下,您是否使用任何规则来确定最佳抽象代码的位置?

0 投票
6 回答
165 浏览

oop - 什么时候需要以接口的形式创建抽象?

您何时鼓励针对接口而不是直接针对具体类进行编程?

我遵循的指导方针是在代码需要跨越逻辑/物理边界时创建抽象,尤其是在涉及与基础设施相关的问题时。

另一个检查点是,由于可能存在额外的关注代码(例如缓存、事务感知、调用 Web 服务而不是进程内执行),或者此类依赖项是否直接引用了基础设施集成点,将来依赖项是否可能会发生变化。

如果代码依赖于不需要控制来跨越逻辑/物理边界的东西,我或多或少不会创建抽象来与它们交互。

我错过了什么吗?

0 投票
8 回答
1372 浏览

language-agnostic - 什么时候抽象和模块化在编程中是一种不好的做法?

刚刚在“你使用什么 JS lib”投票中看到了这条评论

“@Xanti - 是的,是的,编程中的模块化和抽象是一种糟糕的做法。调用其他函数的函数?浪费。”

这让我很好奇,因为我使用的是用于 PHP 的 Kohana 框架和用于 javascript 的 Jquery 库。

为什么有些人认为抽象和模块化是不好的做法?框架和库不是用来简化和加速开发的吗?

这是投票的链接

0 投票
2 回答
1094 浏览

php - 如何创建“真正可扩展”的类

我已经阅读了很多关于开发类的文章(我正在使用 php),其标语是:“可扩展、健壮、可维护和可扩展”。

但作为一个初学者,我一直在创建用我的话来说“只是抽象的”的类。这意味着我只是将一堆或重复的代码分开并将它们放在一个类中并提供访问常见任务的方法。

问题是,我找不到使我的类可扩展的方法(我知道抽象类等的概念,我什至正在使用它们,但只是为了定义我的其他类将遵循的方法)。问题是,我总是发现自己编辑核心类只是为了添加功能

关于使我的课程可扩展的任何提示?(我在谷歌上搜索过,弹出的所有内容都是对抽象类、接口和 OOP 的解释,没有讨论指针或制作可扩展类的一些技巧)。

哦,顺便说一句,放轻松,我在 9 个月前就开始了“实际” oop 编程(我所在的大学让我学习 OOP 的理论,但他们让我们按程序工作,因为它更快并且符合该死的项目截止日期,持续了 4 年,直到我毕业)。

0 投票
7 回答
51078 浏览

c# - 在抽象类中使用泛型

我正在研究一个抽象类,其中实现类需要实现一个 T 列表。问题是这不起作用:

我确定我缺少一个明显的答案,并且我知道我可以构建一个抽象基类型以放入列表中,但是当我使用我的 Linq 命令构建列表时,抽象类型(ItemBase ) 不能很好地与 .ToList() 方法配合使用。我正在尝试做的事情如此独特吗?

0 投票
2 回答
6883 浏览

python - 以独立于平台的方式使用 python 连接到 samba 共享?

无论我的平台如何,是否有一个抽象可以让我连接到 python 中的 samba 共享?

更多信息

我不想挂载共享。我只是想将文件上传到共享中,例如 smbclient 的 put。

谢谢,皮特

0 投票
3 回答
241 浏览

c++ - C++ 继承,基函数在被覆盖时仍被调用

我有以下两个类,一个继承自另一个

然后在另一堂课中,我有以下内容:

这总是打印 A
我希望它打印 B 或 C 取决于我添加到向量中的内容
我该怎么做?
我尝试过抽象,但我不完全确定如何在 C++ 中使用它,而且它对我没有用

0 投票
3 回答
409 浏览

c# - .Net 和 C# 中的多态数值

.Net 中没有数字的多态性,即没有统一不同类型的数字类型(如 bool、byte、uint、int 等)的 INumeric 接口,这真是太可惜了。极端的人想要一个完整的抽象包代数类型。

Joe Duffy 有一篇关于这个问题的文章:

http://www.bluebytesoftware.com/blog/CommentView,guid,14b37ade-3110-4596-9d6e-bacdcd75baa8.aspx

您将如何在 C# 中表达这一点,以便在不影响 .Net 或 C# 的情况下对其进行改造?

我有一个想法,首先定义一个或多个抽象类型(接口,如 INumeric - 或比这更抽象),然后定义实现这些的结构并包装 int 等类型,同时提供返回新类型的操作(例如 Integer32 : INumeric;加法将被定义为

我有点害怕这段代码的执行速度,但至少它是抽象的。

没有运算符重载善良...

还有其他想法吗?

如果.Net 不能具有我认为的这种抽象并且对此保持高效,它看起来就不像一个可行的长期平台。

抽象是重用。

更新:

到目前为止,这是一个示例实现类型签名:

补偿协变返回类型的缺乏。