DEV Community

Cover image for Code Smell 37 - Protected Attributes
Maxi Contieri
Maxi Contieri

Posted on • Edited on • Originally published at maximilianocontieri.com

2

Code Smell 37 - Protected Attributes

Protected attributes are great for encapsulating and controlling access to our properties. They might be warning us for another smell.

Problems

Solutions

  1. Favor composition
  2. Don't subclassify attributes.
  3. Extract behavior to separate objects.
  4. Use [traits](https://en.wikipedia.org/wiki/Trait_(computer_programming) (if available).

Wrong

<?

abstract class ElectronicDevice {

    protected $battery;

    public function __construct(OperatingSystem $battery) {
        $this->battery = $battery;
    }

}

abstract class Idevice extends ElectronicDevice {

    protected $operatingSystem;

    public function __construct(Battery $battery, OperatingSystem $ios) {
        $this->operatingSystem = $ios;
        parent::__construct($battery)
  }

}

final class Ipad extends Idevice {

    public function __construct(Battery $battery, OperatingSystem $ios) {
        parent::__construct($battery, $ios)
  }

}

final class Iphone extends Idevice {

    private $phoneModule:

  public __construct(Battery $batery, OperatingSystem $ios, PhoneModule $phoneModule) {
    $this->phoneModule = $phoneModule;
    parent::__construct($battery, $ios)
  }

}
Enter fullscreen mode Exit fullscreen mode

Right

<?

interface ElectronicDevice {
    //...
}

interface PhoneCommunication {
    //...
}

final class Ipad implements ElectronicDevice {

    private $operatingSystem;
    private $battery;

    public function __construct(Battery $battery, OperatingSystem $ios) {
        $this->operatingSystem = $ios;
        $this->battery = $battery;
    }
}

final class Iphone implements ElectronicDevice, PhoneCommunication {

    private $phoneModule;
    private $operatingSystem;
    private $battery;

    public function __construct(Battery $battery, OperatingSystem $ios, PhoneModule $phoneModule) {
        $this->phoneModule = $phoneModule;
        $this->operatingSystem = $ios;
        $this->battery = $battery;
    }
}
Enter fullscreen mode Exit fullscreen mode

Detection

In languages supporting protected attributes we can avoid them by policy or have a warning of this smell.

Tags

  • Encapsulation

Conclusion

Protected attributes are yet another tool we should use carefully. Every decision is a smell, and we should be very careful with attributes and inheritance.

Relations

More Info

Traits on Wikipedia

Credits

Photo by Jonathan Farber on Unsplash


Subclasses shouldn’t always share all characteristics of their parent class but will do so with inheritance. This can make a program’s design less flexible. It also introduces the possibility of calling methods on subclasses that don’t make sense or that cause errors because the methods don’t apply to the subclass.

Steve Klabnik


This article is part of the CodeSmell Series.

Sentry blog image

How to reduce TTFB

In the past few years in the web dev world, we’ve seen a significant push towards rendering our websites on the server. Doing so is better for SEO and performs better on low-powered devices, but one thing we had to sacrifice is TTFB.

In this article, we’ll see how we can identify what makes our TTFB high so we can fix it.

Read more

Top comments (1)

Collapse
 
theminimalistdeveloper profile image
Rafael Dias

Loving the series!

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay