20220125 TIL
今日は昨日の内容をゆるやかな組み合わせに変えました.
他のクラスを直接使用するクラスの依存性を低減します.
->new宣言が多すぎるのはよくない.
->結合がない場合は、強い結合は使用できません
図のように説明します.
これらはすべてNestjsで完了します.
->制御反転(Inversion Of Control,IoC).
松結合はDependenct-Injection,DI,スプリング,およびネストを用いた.
効率、信頼性、拡張性などの利点があります.コラボレーションツールも一緒にインストールされています
nest new project-name
Npm i -g @nestjs/cli コントローラおよびサービスは、モジュール内の に組み合わされる.モジュールを導入後に入れる、すなわち既に2つのモジュール がある. import { AppModule } from './app.module'; どうして しかしないの?->自動注入依存性
1つの設計モードでは、実行したいユーザーが構造を変更せずに既存のオブジェクトに新しい機能を追加できるようにします.関数定義の前に呼び出されます.
ルースカップリング
他のクラスを直接使用するクラスの依存性を低減します.
きょうけつごう
->new宣言が多すぎるのはよくない.
->結合がない場合は、強い結合は使用できません
実習
import { ProductService} from './services/product.service.js'
import { CashService } from './services/cash.service.js'
export class ProductController{
buyProduct=(req, res)=>{
//1. 가진 돈 검증하는 코드(10줄->2줄)
const cashService = new CashService()
const hasMoney = cashService.checkValue()
//판매여부 검증하는 코드(10줄 -> 2줄)
const productService = new ProductService()
const isSoldout = productService.checkSoldout()
//3. 상품 구매하는 코드
if(hasMoney && !isSoldout){
//상품구매
res.send('상품을 구매합니다')
}
}
refundProduct=(req, res)=> {
//1. 판매여부 검증하는 코드(10줄->2줄)
const productService = new ProductService()
const isSoldout = productService.checkSoldout()
//2. 상품 환불하는 코드
if(!isSoldout){
res.send('상품을 환불합니다')
}
}
}
昨日のコードでは、buyProduct
とredundProduct
で販売されているコードが同じであることを検証しました.export class ProductController{
constructor(moneyService, productService){
this.productService = productService
this.moneyService = moneyService
}
}
私をクラスに入れた.const productService = new ProductService()
const moneyService1 = new CashService() //new 한번으로 모든 곳에서 사용 가능 (싱글톤패턴)
const moneyService2 = new PointService() // 포인트결제 추가
緩やかな結合で放出することができる.しかし依存注入は必ずしもモノトーンモードではない.図のように説明します.
これらはすべてNestjsで完了します.
->制御反転(Inversion Of Control,IoC).
松結合はDependenct-Injection,DI,スプリング,およびネストを用いた.
Nestjs
効率、信頼性、拡張性などの利点があります.
nest new project-name
Npm i -g @nestjs/cli
Typescript
//문자타입 - 타입추론
let aaa = "안녕하세요" //처음 잡힌 타입으로 설정됨
// aaa = 3 //숫자라서 불가능
aaa = "반갑습니다"
//문자타입
let bbb: string = "반갑습니다"
bbb = "반가워요"
bbb = 123
//숫자타입
let ccc = 5
ccc=10
ccc="dd"
//불린타입
let ddd : boolean = true
ddd = 11
ddd = "22"
//배열타입
let eee = [1,2,3,4,5]
let fff : String[] = ["c", "d"]
let ggg : (number| string)[]= [1, "ccc", 3, "33"]
let money : number[] | string[] = [1000, 2000, 3000]
//객체타입
interface Iprofile{
name: string
age: number | string
school: string
}
let profile: Iprofile ={ //Interface의 Iprofile 선언해서 넣어주기
name: "철수",
age: 13,
school:"다람쥐초"
}
profile.age = "13살"//하고싶으면 타입추론되게 하지말고 타입을 직접 만들어줘야함
//함수타입
function qqq(a:number, b:number) : string {// 리턴값도 선언해줌
// return a+b
return "ggg"
}
const result = qqq(1, 2)
このように事前にタイプを指定します.@Decorator
1つの設計モードでは、実行したいユーザーが構造を変更せずに既存のオブジェクトに新しい機能を追加できるようにします.関数定義の前に呼び出されます.
function zzz(aa){
console.log('--------')
console.log(aa)
console.log('--------')
}
@zzz
class AppController{
}
実行時、AppController
クラスの上にdecorator aaa
クラスが記述され、AppController
クラスが関数のパラメータとしてaaa
内部で使用される.Reference
この問題について(20220125 TIL), 我々は、より多くの情報をここで見つけました https://velog.io/@hgyu0830/20220125-TIL-fxe6z9zmテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol