|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Hello everybody!
I'm having a little problem with the following: I wrote a class to collect data (Let's call it DataCollector). Now I want the data to be interpreted in various ways. My idea was to write an interface (iVisualizer) so DataCollector could use every user defined (MyVisualizer) class implementing it. Saying "MyVisualizer extends DataCollector" is not an option, since the data should only be collected once and then then being "rendered" by a variety of output classes (to XML, to plain text, to PDF, etc.). Here is the code example: <php> class DataCollector { private $data public function collectData ($someText) { // Write data here } public function output($visualizer) { $visualizer->output($this) } } class MyVisualizer implements iVisualizer { public function output ($dataCollector) { echo $dataCollector->data; } } $a = new DataCollector(); $b = new MyVisualizer(); $a->collectData("foo"); $a->output($b); </php> Now, obviously calling "$a->output($b);" will get me in trouble, since DataCollector::data is private. Making DataCollector::data public would make it easy, but also "unsafe". Adding get & set methods will add lots of methods, since $data is just an example for a large number of properties. I really hope to get some good ideas here. Thanks in advance! Oli |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Oli Thissen wrote:
> Hello everybody! > > I'm having a little problem with the following: I wrote a class to > collect data (Let's call it DataCollector). Now I want the data to be > interpreted in various ways. My idea was to write an interface > (iVisualizer) so DataCollector could use every user defined > (MyVisualizer) class implementing it. Saying "MyVisualizer extends > DataCollector" is not an option, since the data should only be > collected once and then then being "rendered" by a variety of output > classes (to XML, to plain text, to PDF, etc.). > > Here is the code example: > > <php> > class DataCollector { > private $data > > public function collectData ($someText) { > // Write data here > } > > public function output($visualizer) { > $visualizer->output($this) > } > } > > class MyVisualizer implements iVisualizer { > public function output ($dataCollector) > { > echo $dataCollector->data; > } > } > > $a = new DataCollector(); > $b = new MyVisualizer(); > $a->collectData("foo"); > $a->output($b); > </php> > > Now, obviously calling "$a->output($b);" will get me in trouble, since > DataCollector::data is private. Making DataCollector::data public > would make it easy, but also "unsafe". Adding get & set methods will > add lots of methods, since $data is just an example for a large number > of properties. > > I really hope to get some good ideas here. Thanks in advance! > > Oli > > First of all, a Visualizer object is not a "type of" DataCollector, so trying to derive Visualizer from DataCollector would be incorrect. You have the data items are private, as they should be (encapsulation). So you need getter and setter methods for each one. The getter methods return copies, and the setter methods validate the data before actually storing it. Yes, sometimes it means a bunch of setters and getter methods. But it's also the correct way to do it. -- ================== Remove the "x" from my email address Jerry Stuckle JDS Computer Training Corp. jstucklex@attglobal.net ================== |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On Nov 10, 3:18 pm, Jerry Stuckle <jstuck...@attglobal.net> wrote:
> Oli Thissen wrote: > > Hello everybody! > > > I'm having a little problem with the following: I wrote a class to > > collect data (Let's call it DataCollector). Now I want the data to be > > interpreted in various ways. My idea was to write an interface > > (iVisualizer) so DataCollector could use every user defined > > (MyVisualizer) class implementing it. Saying "MyVisualizer extends > > DataCollector" is not an option, since the data should only be > > collected once and then then being "rendered" by a variety of output > > classes (to XML, to plain text, to PDF, etc.). > > > Here is the code example: > > > <php> > > class DataCollector { > > private $data > > > public function collectData ($someText) { > > // Write data here > > } > > > public function output($visualizer) { > > $visualizer->output($this) > > } > > } > > > class MyVisualizer implements iVisualizer { > > public function output ($dataCollector) > > { > > echo $dataCollector->data; > > } > > } > > > $a = new DataCollector(); > > $b = new MyVisualizer(); > > $a->collectData("foo"); > > $a->output($b); > > </php> > > > Now, obviously calling "$a->output($b);" will get me in trouble, since > > DataCollector::data is private. Making DataCollector::data public > > would make it easy, but also "unsafe". Adding get & set methods will > > add lots of methods, since $data is just an example for a large number > > of properties. > > > I really hope to get some good ideas here. Thanks in advance! > > > Oli > > First of all, a Visualizer object is not a "type of" DataCollector, so > trying to derive Visualizer from DataCollector would be incorrect. > > You have the data items are private, as they should be (encapsulation). > So you need getter and setter methods for each one. The getter > methods return copies, and the setter methods validate the data before > actually storing it. > > Yes, sometimes it means a bunch of setters and getter methods. But it's > also the correct way to do it. > Everything Jerry said is correct. I would add that, if you have a lot of private members (i.e. columns from a table in a database) you can save yourself some work by taking advantage of the __get() and __set() magic methods: <http://www.php.net/manual/en/language.oop5.magic.php> That way you don't need to write individual getters and setters for every piece of data stored in your object. |
|
![]() |
| Outils de la discussion | |
|
|