AddressFormatter::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 0
nc 1
nop 8
dl 0
loc 10
ccs 1
cts 1
cp 1
crap 1
rs 10
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Temidaio\ValueObjects\Formatters;
6
7
use Illuminate\Support\Str;
8
use MichaelRubel\Formatters\Formatter;
9
10
class AddressFormatter implements Formatter
11
{
12
    /**
13
     * @param string|null $prefix
14
     * @param string|null $street
15
     * @param string|null $number
16
     * @param string|null $local
17
     * @param string|null $postcode
18
     * @param string|null $city
19
     * @param string|null $country
20
     * @param string|null $iso_code
21
     */
22 28
    public function __construct(
23
        public ?string $prefix   = null,
24
        public ?string $street   = null,
25
        public ?string $number   = null,
26
        public ?string $local    = null,
27
        public ?string $postcode = null,
28
        public ?string $city     = null,
29
        public ?string $country  = null,
30
        public ?string $iso_code = null
31
    ) {
32 28
    }
33
34
    /**
35
     * String builder.
36
     *
37
     * @var string
38
     */
39
    private string $builder = '';
40
41
    /**
42
     * Run the formatter.
43
     *
44
     * @return string
45
     */
46 28
    public function format(): string
47
    {
48 28
        $this->formatProperties();
49
50 28
        return $this->buildString();
51
    }
52
53
    /**
54
     * Initialize the internal properties.
55
     *
56
     * @return void
57
     */
58 28
    protected function formatProperties(): void
59
    {
60 28
        $this->street = format(
61 28
            StreetFormatter::class,
62 28
            prefix: $this->prefix,
0 ignored issues
show
Bug introduced by
It seems like $this->prefix can also be of type null; however, parameter $formatter of format() does only seem to accept string, 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

62
            /** @scrutinizer ignore-type */ prefix: $this->prefix,
Loading history...
63 28
            street: $this->street,
64 28
            number: $this->number,
65 28
            local: $this->local,
66 28
        );
67
68 28
        $this->country = format(
69 28
            CountryFormatter::class,
70 28
            country: $this->country,
71 28
            iso_code: $this->iso_code
72 28
        );
73
    }
74
75
    /**
76
     * Execute the formatter logic.
77
     *
78
     * @return string
79
     */
80 28
    protected function buildString(): string
81
    {
82 28
        if (! empty($this->street)) {
83 17
            $this->appendStreet();
84
85 17
            if (! empty($this->postcode) || ! empty($this->city) || ! empty($this->country)) {
86 15
                $this->appendComma();
87
            }
88
        }
89
90 28
        empty($this->postcode) ?: $this->appendPostcode();
91
92 28
        empty($this->city) ?: $this->appendCity();
93
94 28
        $this->appendCountry();
95
96 28
        return $this->builder();
97
    }
98
99
    /**
100
     * Sanitize the string builder.
101
     *
102
     * @return string
103
     */
104 28
    protected function builder(): string
105
    {
106 28
        return Str::squish($this->builder);
107
    }
108
109
    /**
110
     * Append the street to the string builder.
111
     *
112
     * @return void
113
     */
114 17
    protected function appendStreet(): void
115
    {
116 17
        $this->builder .= $this->street;
117
    }
118
119
    /**
120
     * Append the street to the string builder.
121
     *
122
     * @return void
123
     */
124 15
    protected function appendComma(): void
125
    {
126 15
        $this->builder .= ', ';
127
    }
128
129
    /**
130
     * Append the post code to the string builder.
131
     *
132
     * @return void
133
     */
134 15
    protected function appendPostcode(): void
135
    {
136 15
        $this->builder .= $this->postcode . ' ';
137
    }
138
139
    /**
140
     * Append the city to the string builder.
141
     *
142
     * @return void
143
     */
144 15
    protected function appendCity(): void
145
    {
146 15
        $this->builder .= $this->city . ' ';
147
    }
148
149
    /**
150
     * Append the country to the string builder.
151
     *
152
     * @return void
153
     */
154 28
    protected function appendCountry(): void
155
    {
156 28
        $this->builder .= $this->country;
157
    }
158
}
159