scoped_attr_accessor 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +48 -48
- data/lib/scoped_attr_accessor/version.rb +1 -1
- metadata +3 -3
data/README.md
CHANGED
@@ -6,54 +6,6 @@ scope of code that comes afterward. You can extend a single class (and
|
|
6
6
|
its subclasses) with scoped accessors, or you can extend ruby's entire
|
7
7
|
class hierarchy.
|
8
8
|
|
9
|
-
## Why Oh Why Does This Exist?!?
|
10
|
-
|
11
|
-
At the time of this writing (April 2013), the ruby community in
|
12
|
-
general is somewhat divided on the meaning of the concept of privacy
|
13
|
-
in ruby. For some, especially those who come from Java, C++, VB, or
|
14
|
-
some other language that enforces encapsulation with privacy, ruby's
|
15
|
-
ability to get around privacy means that encapsulation cannot be
|
16
|
-
enforced. Most of us (I count myself in this camp) have discarded the
|
17
|
-
use of privacy in ruby altogether, as if it were nothing more than a
|
18
|
-
half-hearted nod to other languages' encapsulation practices. Make
|
19
|
-
everything public, since everything's ultimately public anyway, we
|
20
|
-
say; using the private keyword is merely a speedbump which adds no
|
21
|
-
security but does add hassle and headache.
|
22
|
-
|
23
|
-
I am becoming more and more aware of a number of rubyists who consider
|
24
|
-
the use of private and protected methods in ruby to be a useful way to
|
25
|
-
communicate to the reader that the code is highly volatile, under
|
26
|
-
question, subject to change or outright removal, etc., and that for
|
27
|
-
these reasons the code should not be surfaced to the public API of the
|
28
|
-
class. They ALSO consider the private keyword to be merely a
|
29
|
-
speedbump, but one which communicates that maybe you should slow down
|
30
|
-
a bit before trying to access these portions of code. Furthermore,
|
31
|
-
making these methods private or protected makes them "exemplary" to
|
32
|
-
maintainers of the code, meaning that a maintainer will understand the
|
33
|
-
intent of the privacy, and be less likely to *accidentally* create an
|
34
|
-
external dependency on on a method that should have been kept private.
|
35
|
-
|
36
|
-
I am becoming more and more swayed by this second way of thinking, but
|
37
|
-
I find that it falls short in one key area: accessors. It is easy to
|
38
|
-
create a private method in ruby, but creating a private accessor
|
39
|
-
method is actually a bit tortuous. As a result, I see programmers who
|
40
|
-
strongly believe in using privacy to communicate undependable
|
41
|
-
interfaces frequently making use of either instance variables or
|
42
|
-
public accessors for their private variables. These variables are not
|
43
|
-
dependable, at least from a "stable interface" standpoint, so both
|
44
|
-
solutions offer an unfavorable tradeoff. While instance variables
|
45
|
-
communicate privacy, they force the object to depend on its own
|
46
|
-
undependable internal interface. Meanwhile, public accessors allow the
|
47
|
-
class to isolate itself from its undependable interface, but by making
|
48
|
-
it public the communication to the maintainer is that other classes
|
49
|
-
can and should depend on that undependable interface.
|
50
|
-
|
51
|
-
The reason programmers make this tradeoff is that there doesn't seem
|
52
|
-
to be an easy, clean, *elegant* way to create private and protected
|
53
|
-
accessors in ruby. My goal with this gem, then, is to create such a
|
54
|
-
way, so that those who wish to communicate "this variable is
|
55
|
-
undependable and it should be kept isolated for now" can do so easily.
|
56
|
-
|
57
9
|
## Installation
|
58
10
|
|
59
11
|
Add this line to your application's Gemfile:
|
@@ -125,3 +77,51 @@ Tested to work on Ruby 1.9.3 and 2.0.
|
|
125
77
|
1. Commit your changes (`git commit -am 'Add some feature'`)
|
126
78
|
1. Push to the branch (`git push origin my-new-feature`)
|
127
79
|
1. Create new Pull Request
|
80
|
+
|
81
|
+
## Why Oh Why Does This Exist?!?
|
82
|
+
|
83
|
+
At the time of this writing (April 2013), the ruby community in
|
84
|
+
general is somewhat divided on the meaning of the concept of privacy
|
85
|
+
in ruby. For some, especially those who come from Java, C++, VB, or
|
86
|
+
some other language that enforces encapsulation with privacy, ruby's
|
87
|
+
ability to get around privacy means that encapsulation cannot be
|
88
|
+
enforced. Most of us (I count myself in this camp) have discarded the
|
89
|
+
use of privacy in ruby altogether, as if it were nothing more than a
|
90
|
+
half-hearted nod to other languages' encapsulation practices. Make
|
91
|
+
everything public, since everything's ultimately public anyway, we
|
92
|
+
say; using the private keyword is merely a speedbump which adds no
|
93
|
+
security but does add hassle and headache.
|
94
|
+
|
95
|
+
I am becoming more and more aware of a number of rubyists who consider
|
96
|
+
the use of private and protected methods in ruby to be a useful way to
|
97
|
+
communicate to the reader that the code is highly volatile, under
|
98
|
+
question, subject to change or outright removal, etc., and that for
|
99
|
+
these reasons the code should not be surfaced to the public API of the
|
100
|
+
class. They ALSO consider the private keyword to be merely a
|
101
|
+
speedbump, but one which communicates that maybe you should slow down
|
102
|
+
a bit before trying to access these portions of code. Furthermore,
|
103
|
+
making these methods private or protected makes them "exemplary" to
|
104
|
+
maintainers of the code, meaning that a maintainer will understand the
|
105
|
+
intent of the privacy, and be less likely to *accidentally* create an
|
106
|
+
external dependency on on a method that should have been kept private.
|
107
|
+
|
108
|
+
I am becoming more and more swayed by this second way of thinking, but
|
109
|
+
I find that it falls short in one key area: accessors. It is easy to
|
110
|
+
create a private method in ruby, but creating a private accessor
|
111
|
+
method is actually a bit tortuous. As a result, I see programmers who
|
112
|
+
strongly believe in using privacy to communicate undependable
|
113
|
+
interfaces frequently making use of either instance variables or
|
114
|
+
public accessors for their private variables. These variables are not
|
115
|
+
dependable, at least from a "stable interface" standpoint, so both
|
116
|
+
solutions offer an unfavorable tradeoff. While instance variables
|
117
|
+
communicate privacy, they force the object to depend on its own
|
118
|
+
undependable internal interface. Meanwhile, public accessors allow the
|
119
|
+
class to isolate itself from its undependable interface, but by making
|
120
|
+
it public the communication to the maintainer is that other classes
|
121
|
+
can and should depend on that undependable interface.
|
122
|
+
|
123
|
+
The reason programmers make this tradeoff is that there doesn't seem
|
124
|
+
to be an easy, clean, *elegant* way to create private and protected
|
125
|
+
accessors in ruby. My goal with this gem, then, is to create such a
|
126
|
+
way, so that those who wish to communicate "this variable is
|
127
|
+
undependable and it should be kept isolated for now" can do so easily.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scoped_attr_accessor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -111,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
111
|
version: '0'
|
112
112
|
segments:
|
113
113
|
- 0
|
114
|
-
hash:
|
114
|
+
hash: -2597970377507506024
|
115
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
version: '0'
|
121
121
|
segments:
|
122
122
|
- 0
|
123
|
-
hash:
|
123
|
+
hash: -2597970377507506024
|
124
124
|
requirements: []
|
125
125
|
rubyforge_project:
|
126
126
|
rubygems_version: 1.8.25
|