Passed
Push — master ( 99c93a...7b9255 )
by Observer
03:56 queued 02:32
created

NetObject::__get()   C

Complexity

Conditions 13
Paths 12

Size

Total Lines 63
Code Lines 35

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 35
c 1
b 0
f 0
dl 0
loc 63
rs 6.6166
cc 13
nc 12
nop 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace VoidEngine;
4
5
use VoidCore;
6
7
class NetObject implements \ArrayAccess
8
{
9
    protected int $selector = 0;
10
    protected ?string $name = null;
11
    // protected bool $isCollection = false;
12
13
    public function __construct ($name, $assembly = false, ...$args)
14
    {
15
        foreach ($args as $id => $arg)
16
            $args[$id] = EngineAdditions::uncoupleSelector ($arg);
17
        
18
        if (is_int ($name) && VoidCore::objectExists ($name))
19
            $this->selector = $name;
20
21
        elseif (is_string ($name))
22
            $this->selector = VoidCore::createObject ($name, $assembly, ...$args);
23
24
        else throw new \Exception ('Incorrect params passed');
25
26
        /*$this->isCollection = $this->getType ()
27
            ->isSubclassOf (VoidCore::typeof ('System.Collectons.Generic.ICollection'));*/
28
    }
29
30
    public function dispose (): void
31
    {
32
        VoidCore::removeObjects ($this->selector);
33
    }
34
35
    # Основные магические методы
36
37
    public function __get (string $name)
38
    {
39
        switch (strtolower ($name))
40
        {
41
            case 'count':
42
            case 'length':
43
                try
44
                {
45
                    return $this->getProperty ('Count');
46
                }
47
48
                catch (\WinformsException $e)
49
                {
50
                    return $this->getProperty ('Length');
51
                }
52
            break;
53
54
            case 'list':
55
                $size = $this->count;
56
                $list = [];
57
                
58
				for ($i = 0; $i < $size; ++$i)
59
                    $list[] = EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $i));
60
                
61
                return $list;
62
            break;
1 ignored issue
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
63
64
            case 'names':
65
                $size  = $this->count;
66
                $names = [];
67
                
68
                for ($i = 0; $i < $size; ++$i)
69
                    try
70
                    {
71
                        $names[] = VoidCore::getProperty (VoidCore::getArrayValue ($this->selector, [$i, VC_OBJECT]), 'Text');
72
                    }
73
74
                    catch (\WinformsException $e)
75
                    {
76
                        $names[] = VoidCore::getArrayValue ($this->selector, [$i, VC_STRING]);
77
                    }
78
                
79
                return $names;
80
            break;
81
			
82
			case 'name':
83
				try
84
				{
85
					return $this->getProperty ('Name');
86
				}
87
				
88
				catch (\WinformsException $e)
89
				{
90
					return $this->name;
91
				}
92
			break;
93
        }
94
95
        if (method_exists ($this, $method = 'get_'. $name))
96
            return $this->$method ();
97
98
        return isset ($this->$name) ?
99
            $this->$name : EngineAdditions::coupleSelector ($this->getProperty ($name));
100
    }
101
102
    public function __set (string $name, $value): void
103
    {
104
        if (substr ($name, -5) == 'Event')
105
            Events::setEvent ($this->selector, substr ($name, 0, -5), $value);
106
107
        elseif (method_exists ($this, $method = 'set_'. $name))
108
            $this->$method ($value);
109
			
110
		elseif (strtolower ($name) == 'name')
111
		{
112
			try
113
			{
114
				$this->setProperty ($name, $value);
115
			}
116
			
117
			catch (\WinformsException $e)
118
			{
119
				$this->name = $value;
120
			}
121
		}
122
        
123
        else $this->setProperty ($name, EngineAdditions::uncoupleSelector ($value));
124
    }
125
126
    public function __call (string $name, array $args)
127
    {
128
        return EngineAdditions::coupleSelector ($this->callMethod ($name,
129
            array_map ('VoidEngine\\EngineAdditions::uncoupleSelector', $args)));
130
    }
131
132
    # Управление VoidCore
133
134
    protected function getProperty ($name)
135
    {
136
        return VoidCore::getProperty ($this->selector, $name);
137
    }
138
139
    protected function setProperty (string $name, $value): void
140
    {
141
        VoidCore::setProperty ($this->selector, $name, $value);
142
    }
143
144
    protected function callMethod (string $name, array $args = [])
145
    {
146
        return VoidCore::callMethod ($this->selector, $name, ...$args);
147
    }
148
149
    # ArrayAccess
150
151
    public function offsetSet ($index, $value)
152
	{
153
        try
154
        {
155
            $index === null ?
156
                $this->callMethod ('Add', EngineAdditions::uncoupleSelector ($value)) :
0 ignored issues
show
Bug introduced by
It seems like VoidEngine\EngineAdditio...ncoupleSelector($value) can also be of type integer; however, parameter $args of VoidEngine\NetObject::callMethod() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

156
                $this->callMethod ('Add', /** @scrutinizer ignore-type */ EngineAdditions::uncoupleSelector ($value)) :
Loading history...
157
                $this->callMethod ('Insert', $index, EngineAdditions::uncoupleSelector ($value));
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\NetObject::callMethod() has too many arguments starting with VoidEngine\EngineAdditio...ncoupleSelector($value). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

157
                $this->/** @scrutinizer ignore-call */ 
158
                       callMethod ('Insert', $index, EngineAdditions::uncoupleSelector ($value));

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
158
        }
159
160
        catch (\Throwable $e)
161
        {
162
            $index === null ?
163
                VoidCore::setArrayValue ($this->selector, $this->count, EngineAdditions::uncoupleSelector ($value)) :
164
                VoidCore::setArrayValue ($this->selector, $index, EngineAdditions::uncoupleSelector ($value));
165
        }
166
    }
167
	
168
	public function offsetGet ($index)
169
	{
170
		return EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $index), $this->selector);
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\EngineAdditions::coupleSelector() has too many arguments starting with $this->selector. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

170
		return EngineAdditions::/** @scrutinizer ignore-call */ coupleSelector (VoidCore::getArrayValue ($this->selector, $index), $this->selector);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
171
    }
172
	
173
	public function offsetUnset ($index): void
174
	{
175
		$this->callMethod ('RemoveAt', $index);
176
    }
177
    
178
    public function offsetExists ($index): bool
179
    {
180
        try
181
        {
182
            $this->offsetGet ($index);
183
        }
184
185
        catch (\WinformsException $e)
186
        {
187
            return false;
188
        }
189
190
        return true;
191
    }
192
193
    # Итерация массивов
194
195
    public function foreach (callable $callback, string $type = null): void
196
    {
197
        $size = $this->count;
198
199
        for ($i = 0; $i < $size; ++$i)
200
            $callback (EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i);
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\EngineAdditions::coupleSelector() has too many arguments starting with $this->selector. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

200
            $callback (EngineAdditions::/** @scrutinizer ignore-call */ coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
201
    }
202
203
    public function where (callable $comparator, string $type = null): array
204
    {
205
        $size   = $this->count;
206
        $return = [];
207
208
        for ($i = 0; $i < $size; ++$i)
209
            if ($comparator ($value = EngineAdditions::coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i))
0 ignored issues
show
Unused Code introduced by
The call to VoidEngine\EngineAdditions::coupleSelector() has too many arguments starting with $this->selector. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

209
            if ($comparator ($value = EngineAdditions::/** @scrutinizer ignore-call */ coupleSelector (VoidCore::getArrayValue ($this->selector, $type !== null ? [$i, $type] : $i), $this->selector), $i))

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
210
                $return[] = $value;
211
212
        return $return;
213
    }
214
215
    # Магические методы
216
217
    public function __destruct ()
218
    {
219
        VoidCore::destructObject ($this->selector);
220
    }
221
222
    public function __toString (): string
223
    {
224
        return $this->selector;
225
    }
226
227
    public function __debugInfo (): array
228
    {
229
        $info = ['selector' => $this->selector];
230
231
        try
232
        {
233
            $info['name'] = $this->getProperty ('Name');
234
        }
235
236
        catch (\WinformsException $e) {}
1 ignored issue
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
237
238
        try
239
        {
240
            $info['info'] = $this->callMethod ('ToString');
241
        }
242
243
        catch (\WinformsException $e) {}
1 ignored issue
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
244
245
        return $info;
246
    }
247
}
248
249
class NetClass extends NetObject
250
{
251
    public function __construct ($name, $assembly = false)
252
    {
253
        if (is_int ($name) && VoidCore::objectExists ($name))
254
            $this->selector = $name;
255
256
        elseif (is_string ($name))
257
            $this->selector = VoidCore::getClass ($name, $assembly);
258
259
        else throw new \Exception ('Incorrect params passed');
260
    }
261
}
262
263
class EngineAdditions
264
{
265
    public static function coupleSelector ($selector)
266
    {
267
        return is_int ($selector) && VoidCore::objectExists ($selector) ?
268
            new NetObject ($selector) : $selector;
269
    }
270
271
    public static function uncoupleSelector ($object)
272
    {
273
        return is_object ($object) && $object instanceof NetObject ?
274
            $object->selector : $object;
275
    }
276
}
277