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.
2019-01-21T14:01:23 MuffiPackages haben nichts mit Objektorientierung zu tun.
Du kannst ohne OO nahezu genauso übersichtlich und gekapselt programmieren.