对于我的软件开发编程类,我们应该为RSS feed创建一个"Feed Manager"类型的程序.以下是我处理FeedItems实现的方法.
好又简单:
struct FeedItem {
string title;
string description;
string url;
}
Run Code Online (Sandbox Code Playgroud)
我得到了标记,"正确"的示例答案如下:
class FeedItem
{
public:
FeedItem(string title, string description, string url);
inline string getTitle() const { return this->title; }
inline string getDescription() const { return this->description; }
inline string getURL() const { return this->url; }
inline void setTitle(string title) { this->title = title; }
inline void setDescription(string description){ this->description = description; }
inline void setURL(string url) { this->url = url; }
private:
string title;
string description; …Run Code Online (Sandbox Code Playgroud) 是否有像其他语言实现的Python描述符协议?这似乎是一种很好的方法来增加模块化/封装而不会膨胀你的包含类的实现,但我从来没有听说过任何其他语言类似的东西.由于查找开销,是否可能缺少其他语言?
" 抽象和封装是互补的概念:抽象关注于对象的可观察行为......封装集中于产生这种行为的实现......封装通常是通过信息隐藏来实现的,这是隐藏所有内容的过程.物体的秘密对其基本特征没有贡献." - 面向对象分析与设计的Grady Booch
您能否通过信息隐藏向我展示一些有说服力的封装优势的例子?
language-agnostic oop encapsulation abstraction information-hiding
使用在线词典工具并没有多大帮助.我认为封装的方式在计算机科学中的使用并不完全符合它在简单英语中的含义.
计算机科学版本的反义词是什么?更具体地说,什么是封装的反义词,它将作为函数名称使用.
我为什么要在乎?这是我的动机:
// A class with a private member variable;
class Private
{
public:
// Test will be able to access Private's private members;
class Test;
private:
int i;
}
// Make Test exactly like Private
class Private::Test : public Private
{
public:
// Make Private's copy of i available publicly in Test
using Private::i;
};
// A convenience function to quickly break encapsulation on a class to be tested.
// I don't have good name for …Run Code Online (Sandbox Code Playgroud) 我已经阅读了一些关于Getters和Setter使用的文章/帖子,以及它们如何帮助破解域模型对象中封装的目的.我理解不使用setter背后的逻辑 - 你允许客户端代码在对象业务规则和不变量的上下文之外操纵该对象的属性.
现在这位校长仍然困惑我.例如,如果我需要更改对象的成员变量的值,会发生什么?例如,如果某个人的姓名发生变化,我该如何在模型中反映出来?起初我想,为什么没有一个名为'ChangeName'的函数让我传入新名称,然后又可以改变内部'name'变量.嗯....那只是一个二传手不是吧!
我需要澄清的是 - 如果我要完全消除setter,那么在上述情况下,我是否应该完全依赖构造函数参数?我应该通过构造函数传递新的属性值来代替旧的属性值,之后我可以通过将对象传递给我拥有的任何持久性基础结构来持久化更改吗?
这两篇文章在这个讨论中很有用:
getter setter encapsulation domain-driven-design getter-setter
在类中,变量通常被私有化以用于封装,并且将变量限制到特定范围允许更好的错误控制和更少的错误.这是有道理的,因为可以访问变量的位置越少,该变量发生错误的位置就越少.
但是,我总是看到变量变为私有,然后使用getter和setter函数来检索该值(有时甚至是指向该变量的指针!).例如int a是私人防止公共访问,但后来getA()并setA()允许他们直接访问.
那么,getter函数和setter函数是否违背了它的私有性?我的意思是具有访问器功能的私有变量与公共变量相同,只有访问它们的代码才会发生变化.(object.variable vs object.getVariable())
是否有人使用访问器函数将变量设为私有?与公开相比有什么优势吗?
我说的是一般的编程,但主要是C语言(即C,C++,C#,Obj-C).
我有一个很大的代码库,我正在使用它有这样的单位:
unit myformunit;
interface
type
TMyForm = class(Form)
end;
procedure not_a_method1;
procedure not_a_method2;
var
global1,global2,global3:Integer;
...
Run Code Online (Sandbox Code Playgroud)
简而言之,代码的作者没有编写方法,他们编写了全局程序.有成千上万的人.在这些过程中,它们引用了单个实例MyForm:TMyForm.
我正在考虑编写一个解析器/重写器实用程序,它将把这个代码变成"至少是面向对象的代码".策略是将接口和实现部分全局变为表单,作为开始.我意识到这不是优雅的OOP.但这是全球化的一步.
如果我一次可以在一个单元上执行此操作,我可能能够修复项目其余部分的破损,如果我一次只能在一个表单上执行此操作.但我想,以减少而不是做手工的时候需要重写单位的金额.有些表单有500多个过程和500多个接口和实现全局变量,实际上,这些变量特定于它们与同一单元中的单个表单实例的状态.
基本上,如果没有这样的话,我会做的就是编写一个基于Castalia Delphi解析器的解析器.我希望也许ModelMakerCodeExplorer,或者castalia,或其他类似的工具有一些东西至少可以做我需要的一部分,所以我不必自己构建这个实用程序.即使我必须建立它自己,我估计它可能会自动大约有一千至2000小时咕噜工作的我.我至少可以运行它,然后看看有多少中断,然后在我决定重构这段代码的努力之后还原或提交.
实现相同目标的替代策略(从零封装和零OOP,到更多封装,稍微超过零OOP,以增量方式,在大型非结构化delphi代码库上,仅在不可避免的情况下使用对象,并且永远不会对真正的OOP有任何想法,欢迎.
所以我听说在这样的属性中验证一个值:
//dummy example, let's assume that I want my value without dots
public string MyProp
{
set
{
if(value.Contains('.'))
throw new ArgumentException("Must not contain '.'", "value");
}
}
Run Code Online (Sandbox Code Playgroud)
是错的,我应该避免它.
但在早些时候,我被告知这是好方法.我们可以使用封装,只有一个地方可以检查,DRY等.
我的小榜样出了什么问题?
我有一些课
class A(object):
def __init__(self, data):
self._data = data
def _equals(self, other):
return self._data == other._data
Run Code Online (Sandbox Code Playgroud)
Pycharm 不喜欢我访问other._data它,因为它是私有的。
“访问受保护的成员”
这对我来说没有意义,因为访问是从班级内部进行的。
如何抑制此警告或编写正确的代码?
假设我有1个完整的类,其中包含约20种提供不同功能的方法。
现在,我们有多个使用此类的客户端,但我们希望它们具有受限的访问权限。
例如-
客户端1-可以访问method1 / m3 / m5 / m7 / m9 / m11
客户端2-可以访问method2 / m4 / m6 / m8 / m10 / m12
有什么办法可以限制此访问权限?
我认为的一种解决方案:
创建2个扩展父类的新类,并覆盖无法访问的方法,并从中抛出Exception。但是,如果第3个客户端有不同的要求,我们必须为其创建新的子类。
还有其他方法吗?
encapsulation ×10
oop ×5
abstraction ×2
c# ×2
python ×2
c++ ×1
class ×1
delphi ×1
dry ×1
getter ×1
inheritance ×1
java ×1
object ×1
pycharm ×1
refactoring ×1
setter ×1
terminology ×1
unit-testing ×1
yagni ×1