잘못 알려진 프로그래밍 개념 설명

11019 단어 pythonbeginnersphpgo
다음은 초보자가 일반적으로 이해하기 어렵거나 개발자가 잘 모르고 있는 데이터 구조 또는 프로그래밍 요령입니다.

부인 성명



이것은 완전한 것이 아니며 개인적인 선택일 뿐입니다.

배타적 OR 조건이란 무엇입니까?


xor는 특정 사례를 처리하기 위해 PHP와 같은 프로그래밍 언어로 구현된 논리 연산자입니다.

그래도 꽤 사용되지 않거나 잘못 알려진 상태로 남아 있지만 간단한 영어로 xor는 "그것 또는 저것 중 하나지만 둘 다는 아님"을 의미합니다.

PHP에서는 다음을 수행할 수 있습니다.

if ($distance > 8 xor $time_spent > 30) {
    // some code
}


조건은 피연산자 중 하나가 TRUE 로 평가되는 경우에만 TRUE 이며 둘 다는 아닙니다.

비트 XOR이란 무엇입니까?



XOR의 또 다른 일반적인 용도는 ^ 기호를 사용하는 비트 연산입니다.

Python에서는 다음과 같이 사용할 수 있습니다.

a = 19
b = 3
x = a ^ b
print(x) # 16


도대체 왜 우리는 16을 얻습니까?

a = 19 => 10011
b = 3  => 11
a ^ b  => 10000 => 16

^는 숫자의 이진 표현에 대해 연산을 수행합니다.

게다가 두 개의 정수를 입력으로 제공했기 때문에 정수를 얻습니다. 부울을 비교하면 XOR은 부울 값을 반환합니다.

데코레이터 패턴이란?



특정 동작을 구현하는 데코레이터로 개체를 래핑하여 개체의 동작을 수정할 수 있습니다.

원래 코드뿐만 아니라 동일한 코드에 의존하는 다른 구조(예: 클라이언트)에서도 팽창을 방지하는 데 도움이 됩니다.

데코레이터는 일반적으로 동일한 인터페이스를 구현합니다.

<?php 
interface Product
{
    public function price();
}

class Laptop implements Product
{
    public function price () {
        return 700;
    }
}

class Sticker implements Product
{
    private $unit;

    public function __construct (Product $unit) {
        $this->unit = $unit;
    }    

    public function price () {
        return $this->unit->price() + 42;
    }
}

class StickerDev implements Product 
{
    private $unit;

    public function __construct (Product $unit) {
        $this->unit = $unit;
    }    

    public function price () {
        return $this->unit->price() + 50;
    }
}

$laptop = new Laptop();
$sticker = new Sticker($laptop);
$stickerDev = new StickerDev($sticker);
echo $stickerDev->price(); // 792


싱글톤인가 아닌가?



전역적으로 고유한 인스턴스에 액세스할 수 있습니다.

공유 리소스(예: 데이터베이스 연결)에 대한 액세스를 "보호"하기 위해 코드에서 자주 사용됩니다.

또한 코드의 어느 부분에서든 덮어쓸 수 있는 전역 변수를 사용하지 않고 모든 곳에서 가져오는 것이 편리할 수 있습니다.

생성자는 new 키워드를 사용한 추가 인스턴스화를 방지하기 위해 비공개여야 합니다.

반환될 정적 속성에 객체를 저장하기 위해 또 다른 메서드가 생성됩니다.

다음은 일반적인 예입니다.

<?php
class MySingleton {
    private static $instance = null;

    private function __construct() {}

    public static function getInstance()
    {
        if (self::$instance == null) {
          self::$instance = new MySingleton();
        }

        return self::$instance;
    }

    public function __clone() {
       throw new Exception("Don't even try to clone me!");
    }
}

$sin = MySingleton::getInstance();
print_r($sin);


누구도 매직 메소드를 사용하여 싱글톤을 복제하지 못하도록 합니다__clone().

많은 개발자들이 Singleton을 단일 책임 원칙을 존중하지 않고 테스트하기 더 어려운 안티 패턴으로 간주한다는 점에 유의해야 합니다.

신중하게 사용하고 확실하지 않은 경우 팀원과 논의하십시오.

왜 사람들은 구성이 상속보다 낫다고 말합니까?



상속은 아마도 코드를 재사용할 때 가장 직관적인 기술일 것입니다.

큰 주의 사항은 자식 클래스의 요소를 덮어써야 할 가능성이 높기 때문에 빠르게 유지 관리하기가 어려워질 수 있다는 것입니다.

게다가 자식 클래스에서 부모 속성과 메서드에 액세스할 수 있으므로 캡슐화 원칙을 위반하기 쉽습니다.

최악의 시나리오에서는 동일한 기반에 의존하는 다른 많은 영역을 손상시킬 수 있는 기능을 추가하기 위해 "슈퍼 마더 클래스"(~ 상속 체인의 맨 위에 있는 클래스)를 수정하게 될 수 있습니다.

상속을 사용하는 코드가 나쁘다는 의미는 아니지만 모든 것을 부모-자식 관계로 나타낼 수는 없기 때문에 모든 곳에서 사용할 수는 없습니다.

예를 들어 Go에서는 상속을 사용하고 요소를 직접 확장할 수도 없습니다. 예를 들어 구조체를 사용하여 구성해야 합니다.

package main

import (
    "fmt"
)

type RST interface {
    Test()
}

type UVW interface {
    RST
}

type Compo struct{}

func (z Compo) Test() {
    fmt.Println("Test Compo")
}

func Demo(x UVW) {
    x.Test()
}

type XYZ struct {
    Compo
}

func main() {
    test := XYZ{}
    Demo(test)
}


컴포지션을 사용하면 객체와 다른 유형을 마음대로 결합하고 런타임에 동작을 수정할 수 있습니다.

마무리



이 실용적인 예를 통해 몇 가지를 배웠기를 바랍니다.

좋은 웹페이지 즐겨찾기