객체 디자인 스타일 가이드 요약
26355 단어 programmingbeginnersjavaphp
객체 작성 및 사용 방법
저는 지금 재미있는 책을 읽고 있습니다. 이름은Matthias Noback입니다. 가능한 한 대상을 가장 잘 만드는 방법에 관한 책입니다. 그래서 저는 그것을 여기에 가지고 와서 제가 발견한 더 재미있는 기교와 지시를 보여드리기로 했습니다.물론, 만약 네가 이 화제를 깊이 있게 탐구하고 싶다면, 나는 네가 책 전체를 읽는 것을 건의한다.
1: OOP 개념 소개
이 책에서 계승은 대상 프로그래밍의 지주 중 하나로 여겨지지만 작은 역할을 하고 있다.실제로 상속을 사용하면 디자인의 혼란을 초래할 수 있다.
이 책에서 상속은 주로 두 가지 상황에서 사용될 것이다.
대부분의 다른 상황에서, 우리는 개발자가 우리의 클래스에서 확장되는 것을 적극적으로 막기를 바란다.클래스 앞에final 키워드를 추가해서 실현할 수 있습니다.잠시 후에 진일보한 설명을 드리겠습니다.
이 작문은 유산보다 더 환영을 받는다.
각 테스트 방법의 기본 구조는 배열-동작-단언:
1. 스케줄링: 테스트 중인 객체(SUT 또는 테스트 대상)를 알려진 상태로 둡니다.
제2막: 그중의 한 방법을 호출한다.
3 단언: 최종 상태에 대해 단언을 한다.
개똥이 현실이 됐어.두 가지 유형의 객체가 있습니다.
서비스 대상은 집행기로서 통상적으로 그들의 업무를 지시하는 것으로 유명하다. 즉, 표현기, 계산기, 메모리 라이브러리, 스케줄러 등
2. 서비스에 전념
여기에는 서비스를 어떻게 해야 하는지에 대한 많은 건의가 있습니다. 저는 이 건의들을 열거할 것입니다.
다음은 매개 변수 $appConfig가 캐시를 가져오는 디렉터리에만 어떻게 사용되는지 보여 줍니다. 따라서, 전체 설정 대상을 주입하지 말고 서비스가 실제 필요로 하는 값만 주입하도록 하십시오.
interface Logger
{
public function log(string $message): void;
}
final class FileLogger implements Logger
{
private Formatter $formatter;
// Formatter is a dependency of FileLogger
public function __ construct(Formatter $formatter)
{
$this->formatter = $formatter;
}
public function log(string $message): void
{
formattedMessage = $this->formatter->format($message) ;
// ….
}
}
final class MySQLTableGateway
{
public function __construct(
string $host,
int $port,
string $username,
string $password,
string $database,
string $table
) {
// ...
}
}
좋은 방법final class MySQLTableGateway
{
public function __construct(
ConnectionConfiguration $connectionConfiguration,
string $table
) {
// $table is the name of the table, It isn’t necessary to make the connection
}
}
final class EventDispatcher
{
private array $listeners = [];
public function addListener(
string $event,
callable $listener
): void {
$this->listeners[event][] = $listener;
}
}
final class FileLogger implements Logger
{
private string $logFilePath;
public function __construct(string $logFilePath)
{
// $logFilePath should be properly set up, so we just need a safety check
if (! is_writable($logFilePath)) {
throw new InvalidArgumentException(
'Log file path ’ . $logFilePath . ‘ should be writable’
);
}
$this->logFilePath = $logFilePath;
}
public function log(string message): void
{
// ...
}
}
final class ResponseFactory
{
public function createApiResponse(array $data): Response
{
// json_encode is a hidden dependency
return new Response(
json_encode(
$data,
JSON_THROW_ON_ERROR | JSON_FORCE_OBJECT), ['Content-Type' => 'application/json']
);
}
}
좋은 방법final class JsonEncoder
{
/ **
* throws RuntimeException
*/
public function encode(array $data): string
{
try {
return json_encode(
$data,
JSON_THROW_ON_ERROR | JSON_FORCE_OBJECT
);
// we can throw our own exception, with more specific info
} catch (RuntimeException previous) {
throw new RuntimeException(
'Failed to encode data: ' . var_export($data, true),
0,
previous
);
}
}
}
final class ResponseFactory
{
private JsonEncoder $jsonEncoder;
// JsonEncoder can be injected as a dependency
public function __construct(JsonEncoder $jsonEncoder)
{
$this->jsonEncoder = $jsonEncoder;
}
public function createApiResponse(data): Response
{
return new Response($this->jsonEncoder->encode($data));
}
}
date () 와 언어의 대형 핵심 프로그램으로 같은 일을 할 수 있습니다. 응용 프로그램 층이 이렇게 결합됩니다.3. 기타 물체
3.1 가치 대상 및 모델/실체
주요 권장 사항은 다음과 같습니다.
final class Coordinates
{
public function _construct(float $latitude, float $longitude)
{
if ($latitude > 90 || $latitude < -90) {
throw new InvalidArgumentException(
'Latitude should be between -90 and 90'
);
}
$this->latitude = $latitude;
}
}
$salesOrder = new SalesOrder();
더 좋은 방법$salesOrder = SalesOrder::place();
construct 방법을 private로 설정하여 사용하지 않도록 하고 place () 방법에서 구조 함수를 호출할 수 있습니다.final class DecimalValue
{
private int value;
private int precision;
private function __construct(int $value, int $precision)
{
this.value = value;
Assertion.greaterOrEqualThan($precision, 0);
$this->precision = $precision;
}
public static function fromInt(
int $value,
int $precision
): DecimalValue {
return new DecimalValue($value, $precision);
}
public static function fromFloat(
float $value,
int $precision
): DecimalValue (
return new DecimalValue(
(int) round($value * pow(10, precision)),
$precision
):
}
}
public function it_can_be_constructed(): void
{
$coordinates = new Coordinates(60.0, 100.0);
assertEquals(60.0, $coordinates->latitude());
assertEquals(100.0, $coordinates->longitude());
}
3.2 DTO(데이터 전송 개체)
3.1 규칙은 이러한 유형의 객체 DTO에 적합하지 않습니다.값 대상과 모델에서 우리는 데이터의 일치성과 유효성을 원하지만 DTO에서는 데이터를 한 점에서 다른 점으로 전송하기를 원한다.
final class ScheduleMeetup
{
public string $title;
public string $date;
public static function fromFormData(
array $formData
): ScheduleMeetup {
$scheduleMeetup = new ScheduleMeetup();
$scheduleMeetup->title = $formData['title'];
$scheduleMeetup->date = $formData['date'];
return $scheduleMeetup;
}
}
객체에는 비헤이비어를 포함하는 방법, 정보를 읽어들이는 질의와 작업을 수행하는 명령 등 두 가지 방법이 있지만 모두 동일한 템플릿으로 설계할 수 있습니다. 즉,1º 매개 변수를 검사하고 문제가 발생하면 오류를 던집니다.
2:반드시 해야 할 일을 하고 필요할 때 실수를 던진다.
3º 검사 후 조건 검사.만약 당신이 좋은 테스트를 한다면, 이것은 불필요한 것이지만, 예를 들어, 만약 당신이 코드를 남겼다면, 이것은 안전 검사에 유리할 수 있다.
조회 방법이면 4º으로 돌아갑니다.
이상은 코드에서 매우 좋은 부분이며, 어떤 경우에는 사용자 정의 이상을 사용하는 것이 매우 유용합니다.
1º 더 높은 등급의 특정 이상 유형을 포착하고 싶다면
try {
// possibly throws ‘SomeSpecific’ exception
} catch (SomeSpecific $exception) {
// …
}
2º 단일 유형의 이상을 실례화하는 여러 방식이 있다면final class CouldNotDeliverOrder extends RuntimeException
{
public static function itWasAlreadyDelivered(): CouldNotDeliverOrder
{
// ...
}
public static function insufficientQuantitiesInStock(): CouldNotDeliverOrder
{
//...
}
}
3º명명 구조 함수를 사용하여 예외를 실례화하려면final class CouldNotFindProduct extends RuntimeException
{
public static function withId(
ProductId $productld
): CouldNotFindProduct (
return new CouldNotFindProduct('Could not find a product with ID’ . $productld);
}
}
throw CouldNotFindProduct .withId(/* ... */);
Exception 클래스의 이름에 "Exception"을 추가하지 않고 Invalid Email Address 또는 Could NotFind Product와 같은 명시적인 이름을 사용합니다.이것이 바로 모든 사람들이다. 책에는 아직 너무 많은 예가 있기 때문에 나는 모두가 보도록 격려한다.만약 당신이 이 책의 두 번째 부분을 원한다면, 평론에서 저에게 알려 주세요.
출처 및 추가 정보
Blog of the book author
Reference
이 문제에 관하여(객체 디자인 스타일 가이드 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/migueldevelopez/object-design-style-guide-summary-42bl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)