1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#! /usr/bin/perl use strict; use warnings; use 5.010; package Foo; sub new { my $class = shift; my $self = {}; bless $self,ref($class)||$class; return $self; } sub foo { my $self = shift; say "I am foo() calling bar()."; $self->bar(); } sub bar { my $self = shift; say "I am bar()."; } package main; my $example = Foo->new(); $example->foo();
2019-01-20T11:10:19 Linuxer
Code (perl): (dl )1 2 3 4 5 6 7 8sub new { my $class = shift; my $self = {}; bless $self,ref($class)||$class; return $self; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub new {
$pkg=shift;
$self={};
require "/etc/perl/***Assembler/dataCore.pm";
require "/etc/perl/***Assembler/jobCore.pm";
require "/etc/perl/***Assembler/cronBase.pm";
bless $self, $pkg;
return $self;
}
1 2 3 4 5 6 7
# 1. initialisiere ein neues Objekt der Klasse "Foo" my $object = Foo->new(); # vs. # 2. initialisiere ein neues Objekt der gleichen Klasse wie $object eines ist my $object2 = $object->new();
2019-01-20T18:36:38 LinuxerDas bless $self,ref($class)||$class; wird interessant, wenn Du new() auf ein bestehendes Objekt aufrufst.
Also:
Code (perl): (dl )1 2 3 4 5 6 7# 1. initialisiere ein neues Objekt der Klasse "Foo" my $object = Foo->new(); # vs. # 2. initialisiere ein neues Objekt der gleichen Klasse wie $object eines ist my $object2 = $object->new();
Wird der Klassenname verwendet (wie in 1.), liefert ref($class) einen Leerstring, was als "unwahr" interpretiert wird, und der übergebene Klassenname wird für das bless() verwendet.
Im zweiten Fall liefert ref($class) den Klassennamen der aufrufenden Objektes und bless verwendet diesen.
Das ist hilfreich, wenn Du beispielsweise Objekte gleichen Typs herstellen willst.
Bei mir landet das automatisch immer in der new()-Routine; ist eine Gewohnheit mittlerweile bei mir...
2019-01-20T21:55:54 LinuxerIch will ja, dass mit
[...] Es hängt von Deiner Modellierung ab, [..]
2019-01-20T12:36:19 GwenDragonZeige bitte mal ein paar eingedampfte Codezeilen, wo es bei dir nicht geht .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
sub hole***Seite {
##########################################################################################################################################################################
# Methodeninfo:
# hole***Seite lädt die übergebene seite von *** und stellt sie im ergebnis bereit.
#
#
#
##################################################################################
#
# Erwartet:
# - vorherigen login in ** über **Login();
# - URL
#
#####################################################
# v1.0 (erste Rohversion) 18.Jan.2019 20:02
#
#
#####################################################
$self=shift;
$url=$_[0];
$mech->get($url);
$content=$mech->content();
return $content;
}
sub hole**SeiteIntern {
##########################################################################################################################################################################
# Methodeninfo:
# hole**SeiteIntern ist ein workaround!!!!!! die methode kann von einer methode der selben klasse so direkt nicht aufgerufen ewrden.. es liegt am $self=shift;
#
#
#
##################################################################################
#
# Erwartet:
#
#
#####################################################
# v1.0 (erste Rohversion) 18.Jan.2019 22:05
#
#
#####################################################
$url=$_[0];
$mech->get($url);
$content=$mech->content();
return $content;
}
2019-01-20T17:02:17 kolibri250hatte es ebenfalls mit $self->methodenname($url); versucht, mit gleichem ergebnis.. die übergebene url hing dann in $self
2019-01-20T20:11:04 Linuxer2019-01-20T17:02:17 kolibri250hatte es ebenfalls mit $self->methodenname($url); versucht, mit gleichem ergebnis.. die übergebene url hing dann in $self
Dann ist meiner Meinung nach vor dem Aufruf was schief gelaufen und $self wurde vor dem Aufruf mit der URL befüllt bzw. überschrieben.
2019-01-20T20:11:04 Linuxer2019-01-20T17:02:17 kolibri250hatte es ebenfalls mit $self->methodenname($url); versucht, mit gleichem ergebnis.. die übergebene url hing dann in $self
Dann ist meiner Meinung nach vor dem Aufruf was schief gelaufen und $self wurde vor dem Aufruf mit der URL befüllt bzw. überschrieben.
QuoteWenn eine Klasse instantiiert wird, benötige ich als erstes die angabe $self=shift; um den Klassennamen bekannt zu machen.
2019-01-20T14:36:16 rostiQuoteWenn eine Klasse instantiiert wird, benötige ich als erstes die angabe $self=shift; um den Klassennamen bekannt zu machen.
Falsch! Mach mal einen Dump auf $self dann siehs Du, daß $self die Instanz ist die mit dem Namen der Klasse gesegnet wurde.
Alles Weitere ergibt sich aus dieser Erkenntnis!
MfG
Quotebin jetzt jedoch an die Grenzen des wartbaren/vertretbaren gestossen, so daß ich mich wohl oder übel mit der Objektorientierung befassen musste.
QuoteWenn Code nicht mehr wartbar ist liegt das eher nicht an fehlender Objektorientierung.
QuotePackages haben nichts mit Objektorientierung zu tun.
2019-01-21T14:01:23 MuffiPackages haben nichts mit Objektorientierung zu tun.
Du kannst ohne OO nahezu genauso übersichtlich und gekapselt programmieren.