Task: Create an Example of Code That Need Refactoring

Before

class CorelogicAu
{
    public function getPropertyDetail($id)
    {
        $response = $this->http->get(SELF::ENDPOINT_ADDRESS . $id);

        return $response->getBody()->toArray();
    }
}

class CorelogicNz
{
    public function getProperty(string $addressId)
    {
        $coreAddress = $this->http->get(SELF::ENDPOINT_ADDRESS . $id);
        $geoLocation = $this->http->get(SELF::ENDPOINT_ADDRESS_COORDINATE . $id);

        return array_merge(
            $coreAddress->getBody()->toArray(),
            $geoLocation->getBody()->toArray()
        );
    }
}

After

interface CorelogicDatasource
{
    public function getProperty(string $id): ?CorelogicProperty;
}

class CorelogicProperty
{
    public string $id;
    public string $address;
    public float $area;
    public float $latitude;
    public float $longitude;

    public function __construct(
        string $id,
        string $address,
        float $area,
        float $latitude,
        float $longitude
    )
    {
        $this->id = $id;
        $this->address = $address;
        $this->area = $area;
        $this->latitude = $latitude;
        $this->longitude = $longitude;
    }
}

class CorelogicAu implements CorelogicDatasource
{
    public function getProperty(string $id): ?CorelogicProperty
    {
        $response = $this->http->get(SELF::ENDPOINT_ADDRESS . $id);
        $response = $response->getBody()->json();

        if (empty($response->id)) {
            return null;
        }

        return new CorelogicProperty(
            $response->id,
            $response->address,
            $response->area,
            $response->latitude,
            $response->longitude,
        )
    }
}

class CorelogicNz implements CorelogicDatasource
{
    public function getProperty(string $id): ?CorelogicProperty
    {
        $coreAddress = $this->http->get(SELF::ENDPOINT_ADDRESS . $id);
        $coreAddress = $coreAddress->getBody()->json();

        $geoLocation = $this->http->get(SELF::ENDPOINT_ADDRESS_COORDINATE . $id);
        $geoLocation = $geoLocation->getBody()->json();

        if (empty($coreAddress->id)) {
            return null;
        }

        return new CorelogicProperty(
            $coreAddress->id,
            $coreAddress->address,
            $coreAddress->area,
            $geoLocation->latitude,
            $geoLocation->longitude,
        )
    }
}

Date
28 July 2023