portaldacalheta.pt
  • Κύριος
  • Σχεδιασμός Ux
  • Συμβουλές Και Εργαλεία
  • Σχεδιασμός Διεπαφής Χρήστη
  • Επενδυτές & Χρηματοδότηση
Πίσω Μέρος

Εργασία με TypeScript, Dependency Injection και Discord Bots



Τύποι και δοκιμαστικός κώδικας είναι δύο από τους πιο αποτελεσματικούς τρόπους αποφυγής σφαλμάτων, ειδικά καθώς ο κώδικας αλλάζει με την πάροδο του χρόνου. Μπορούμε να εφαρμόσουμε αυτές τις δύο τεχνικές στην ανάπτυξη JavaScript, αξιοποιώντας το σχέδιο σχεδίασης TypeScript και την εξάρτηση έγχυσης (DI), αντίστοιχα.

Σε αυτό το σεμινάριο TypeScript, δεν θα καλύψουμε άμεσα τα βασικά του TypeScript, εκτός από τη συλλογή. Αντ 'αυτού, θα δείξουμε απλώς τις βέλτιστες πρακτικές TypeScript καθώς εξετάζουμε πώς να φτιάχνουμε ένα bot Discord από το μηδέν, να συνδέουμε τις δοκιμές και το DI και να δημιουργούμε ένα δείγμα υπηρεσίας. Θα χρησιμοποιούμε:



  • Node.js
  • Τύπος γραφής
  • Discord.js, ένα περιτύλιγμα για το Discord API
  • InversifyJS, ένα πλαίσιο έγχυσης εξάρτησης
  • Δοκιμή βιβλιοθηκών: Mocha, Chai και ts-mockito
  • Μπόνους: Mongoose και MongoDB, για να γράψετε ένα τεστ ενοποίησης

Ρύθμιση του έργου Node.js

Αρχικά, ας δημιουργήσουμε έναν νέο κατάλογο που ονομάζεται typescript-bot. Στη συνέχεια, εισαγάγετέ το και δημιουργήστε ένα νέο έργο Node.js εκτελώντας:



npm init

Σημείωση: Θα μπορούσατε επίσης να χρησιμοποιήσετε το yarn για αυτό, αλλά ας κολλήσουμε στο npm για λόγους συντομίας.



Αυτό θα ανοίξει έναν διαδραστικό οδηγό, ο οποίος θα ρυθμίσει το package.json αρχείο. Μπορείτε να πατήσετε με ασφάλεια Εισαγω για όλες τις ερωτήσεις (ή παρέχετε κάποιες πληροφορίες εάν θέλετε). Στη συνέχεια, ας εγκαταστήσουμε τις εξαρτήσεις μας και τις εξαρτήσεις dev (αυτές που απαιτούνται μόνο για τις δοκιμές).

npm i --save typescript discord.js inversify dotenv @types/node reflect-metadata npm i --save-dev chai mocha ts-mockito ts-node @types/chai @types/mocha

Στη συνέχεια, αντικαταστήστε το δημιουργημένο 'scripts' ενότητα στο package.json με:



'scripts': { 'start': 'node src/index.js', 'watch': 'tsc -p tsconfig.json -w', 'test': 'mocha -r ts-node/register 'tests/**/*.spec.ts'' },

Τα διπλά εισαγωγικά γύρω στο tests/**/*.spec.ts χρειάζονται για να βρείτε αρχεία αναδρομικά. (Σημείωση: Η σύνταξη ενδέχεται να διαφέρει για προγραμματιστές που χρησιμοποιούν Windows.)

Το start Το σενάριο θα χρησιμοποιηθεί για την εκκίνηση του bot, το watch σενάριο για τη μεταγλώττιση του κώδικα TypeScript και test για να εκτελέσετε τις δοκιμές.



Τώρα, το package.json το αρχείο πρέπει να έχει την εξής μορφή:

τι κάνει ο κόμβος js
{ 'name': 'typescript-bot', 'version': '1.0.0', 'description': '', 'main': 'index.js', 'dependencies': { '@types/node': '^11.9.4', 'discord.js': '^11.4.2', 'dotenv': '^6.2.0', 'inversify': '^5.0.1', 'reflect-metadata': '^0.1.13', 'typescript': '^3.3.3' }, 'devDependencies': { '@types/chai': '^4.1.7', '@types/mocha': '^5.2.6', 'chai': '^4.2.0', 'mocha': '^5.2.0', 'ts-mockito': '^2.3.1', 'ts-node': '^8.0.3' }, 'scripts': { 'start': 'node src/index.js', 'watch': 'tsc -p tsconfig.json -w', 'test': 'mocha -r ts-node/register 'tests/**/*.spec.ts'' }, 'author': '', 'license': 'ISC' }

Δημιουργία νέας εφαρμογής στον πίνακα ελέγχου Discord Apps

Για να αλληλεπιδράσουμε με το Discord API, χρειαζόμαστε ένα διακριτικό. Για να δημιουργήσουμε ένα τέτοιο διακριτικό, πρέπει να καταχωρήσουμε μια εφαρμογή στον Πίνακα ελέγχου προγραμματιστή Discord. Για να το κάνετε αυτό, πρέπει να δημιουργήσετε έναν λογαριασμό Discord και να μεταβείτε στη διεύθυνση https://discordapp.com/developers/applications/ . Στη συνέχεια, κάντε κλικ στο Νέα εφαρμογή κουμπί:



Διχόνοια

Επιλέξτε ένα όνομα και κάντε κλικ Δημιουργώ . Στη συνέχεια, κάντε κλικ στο Μποτ → Προσθήκη Bot και τελειώσατε. Ας προσθέσουμε το bot σε έναν διακομιστή. Αλλά μην κλείσετε αυτήν τη σελίδα ακόμη, θα πρέπει να αντιγράψουμε ένα διακριτικό σύντομα.



Προσθέστε το Discord Bot στον διακομιστή σας

Για να δοκιμάσουμε το bot μας, χρειαζόμαστε διακομιστή Discord. Μπορείτε να χρησιμοποιήσετε έναν υπάρχοντα διακομιστή ή να δημιουργήσετε έναν νέο. Για να το κάνετε αυτό, αντιγράψτε το CLIENT_ID του bot που βρίσκεται στην καρτέλα Γενικές πληροφορίες και χρησιμοποιήστε το ως μέρος αυτού ειδική άδεια Διεύθυνση URL:

https://discordapp.com/oauth2/authorize?client_id=&scope=bot



Όταν πατήσετε αυτό το URL σε ένα πρόγραμμα περιήγησης, εμφανίζεται μια φόρμα όπου μπορείτε να επιλέξετε το διακομιστή όπου θα πρέπει να προστεθεί το bot.

Τυπικό μήνυμα καλωσορίσματος Discord ως απάντηση στο bot μας που εντάχθηκε στο διακομιστή.

Αφού προσθέσετε το bot στον διακομιστή σας, θα δείτε ένα μήνυμα όπως το παραπάνω.

Δημιουργία του .env Αρχείο

Χρειαζόμαστε κάποιον τρόπο για να αποθηκεύσουμε το διακριτικό στην εφαρμογή μας. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε το dotenv πακέτο. Αρχικά, λάβετε το διακριτικό από το Discord Application Dashboard ( Μποτ → Κάντε κλικ για να αποκαλύψετε το κουπόνι ):

ο

Τώρα, δημιουργήστε ένα .env αρχείο και, στη συνέχεια, αντιγράψτε και επικολλήστε το διακριτικό εδώ:

TOKEN=paste.the.token.here

Εάν χρησιμοποιείτε το Git, τότε αυτό το αρχείο πρέπει να τοποθετηθεί στο .gitignore, έτσι ώστε το διακριτικό να μην παραβιαστεί. Επίσης, δημιουργήστε ένα .env.example αρχείο, ώστε να είναι γνωστό ότι TOKEN χρειάζεται να ορίσει:

TOKEN=

Σύνταξη TypeScript

Για να μεταγλωττίσετε το TypeScript, μπορείτε να χρησιμοποιήσετε το npm run watch εντολή. Εναλλακτικά, εάν χρησιμοποιείτε PHPStorm (ή άλλο IDE), απλώς χρησιμοποιήστε το πρόγραμμα παρακολούθησης αρχείων από την προσθήκη TypeScript και αφήστε το IDE σας να χειριστεί τη συλλογή. Ας δοκιμάσουμε τη ρύθμισή μας δημιουργώντας ένα src/index.ts αρχείο με τα περιεχόμενα:

console.log('Hello')

Επίσης, ας δημιουργήσουμε ένα tsconfig.json αρχείο όπως παρακάτω. Το InversifyJS απαιτεί experimentalDecorators, emitDecoratorMetadata, es6 και reflect-metadata:

{ 'compilerOptions': { 'module': 'commonjs', 'moduleResolution': 'node', 'target': 'es2016', 'lib': [ 'es6', 'dom' ], 'sourceMap': true, 'types': [ // add node as an option 'node', 'reflect-metadata' ], 'typeRoots': [ // add path to @types 'node_modules/@types' ], 'experimentalDecorators': true, 'emitDecoratorMetadata': true, 'resolveJsonModule': true }, 'exclude': [ 'node_modules' ] }

Εάν το πρόγραμμα παρακολούθησης αρχείων λειτουργεί σωστά, θα πρέπει να δημιουργήσει ένα src/index.js αρχείο και εκτελείται npm start θα πρέπει να έχει ως αποτέλεσμα:

> node src/index.js Hello

Δημιουργία τάξης Bot

Τώρα, ας αρχίσουμε να χρησιμοποιούμε την πιο χρήσιμη λειτουργία του TypeScript: τύπους. Προχωρήστε και δημιουργήστε τα ακόλουθα src/bot.ts αρχείο:

import {Client, Message} from 'discord.js'; export class Bot { public listen(): Promise { let client = new Client(); client.on('message', (message: Message) => {}); return client.login('token should be here'); } }

Τώρα, μπορούμε να δούμε τι χρειαζόμαστε εδώ: ένα διακριτικό! Θα το αντιγράψουμε απλώς εδώ, ή θα φορτώσουμε την τιμή απευθείας από το περιβάλλον;

Κανενα απο τα δυο. Αντ 'αυτού, ας γράψουμε έναν πιο διατηρήσιμο, επεκτάσιμο και δοκιμαστικό κώδικα, εισάγοντας το διακριτικό χρησιμοποιώντας το πλαίσιο εγχύσεων εξάρτησης της επιλογής μας, InversifyJS.

Επίσης, μπορούμε να δούμε ότι το Client Η εξάρτηση είναι κωδικοποιημένη. Θα το εγχύσουμε επίσης.

Διαμόρφωση του δοχείου εγχύσεων εξάρτησης

ΠΡΟΣ ΤΟ δοχείο έγχυσης εξάρτησης είναι ένα αντικείμενο που ξέρει να δημιουργεί άλλα αντικείμενα. Συνήθως, ορίζουμε εξαρτήσεις για κάθε τάξη και το κοντέινερ DI φροντίζει να τα επιλύσει.

Το InversifyJS συνιστά την τοποθέτηση εξαρτήσεων σε ένα inversify.config.ts αρχείο, οπότε ας προχωρήσουμε και προσθέστε το κοντέινερ DI εκεί:

import 'reflect-metadata'; import {Container} from 'inversify'; import {TYPES} from './types'; import {Bot} from './bot'; import {Client} from 'discord.js'; let container = new Container(); container.bind(TYPES.Bot).to(Bot).inSingletonScope(); container.bind(TYPES.Client).toConstantValue(new Client()); container.bind(TYPES.Token).toConstantValue(process.env.TOKEN); export default container;

Επίσης, προτείνουν τα έγγραφα InversifyJS δημιουργία ενός types.ts αρχείο, και καταγράφοντας κάθε τύπο που πρόκειται να χρησιμοποιήσουμε, μαζί με ένα σχετικό Symbol. Αυτό είναι αρκετά άβολο, αλλά διασφαλίζει ότι δεν υπάρχουν συγκρούσεις ονομάτων καθώς μεγαλώνει η εφαρμογή μας. Κάθε Symbol είναι ένα μοναδικό αναγνωριστικό, ακόμα και όταν η παράμετρος περιγραφής της είναι η ίδια (η παράμετρος είναι μόνο για σκοπούς εντοπισμού σφαλμάτων).

export const TYPES = { Bot: Symbol('Bot'), Client: Symbol('Client'), Token: Symbol('Token'), };

Χωρίς τη χρήση Symbol s, δείτε πώς φαίνεται όταν συμβαίνει μια σύγκρουση ονομάτων:

Error: Ambiguous match found for serviceIdentifier: MessageResponder Registered bindings: MessageResponder MessageResponder

Σε αυτό το σημείο, είναι ομοιόμορφο περισσότερο άβολο για να διαλέξετε ποια MessageResponder πρέπει να χρησιμοποιείται, ειδικά εάν το δοχείο DI μεγαλώνει. Η χρήση του Symbol s το φροντίζει, και δεν έχουμε βρει περίεργα γραμματοσειρά στην περίπτωση που έχουμε δύο τάξεις με το ίδιο όνομα.

προβλήματα ασφάλειας στον κυβερνοχώρο και λύσεις

Χρήση του κοντέινερ στην εφαρμογή Discord Bot

Τώρα, ας τροποποιήσουμε το Bot τάξη για χρήση του κοντέινερ. Πρέπει να προσθέσουμε @injectable και @inject() σχολιασμοί για να το κάνετε αυτό. Εδώ είναι το νέο Bot τάξη:

import {Client, Message} from 'discord.js'; import {inject, injectable} from 'inversify'; import {TYPES} from './types'; import {MessageResponder} from './services/message-responder'; @injectable() export class Bot { private client: Client; private readonly token: string; constructor( @inject(TYPES.Client) client: Client, @inject(TYPES.Token) token: string ) { this.client = client; this.token = token; } public listen(): Promise { this.client.on('message', (message: Message) => { console.log('Message received! Contents: ', message.content); }); return this.client.login(this.token); } }

Τέλος, ας δημιουργήσουμε το bot μας στο index.ts αρχείο:

require('dotenv').config(); // Recommended way of loading dotenv import container from './inversify.config'; import {TYPES} from './types'; import {Bot} from './bot'; let bot = container.get(TYPES.Bot); bot.listen().then(() => { console.log('Logged in!') }).catch((error) => { console.log('Oh no! ', error) });

Τώρα, ξεκινήστε το bot και προσθέστε το στο διακομιστή σας. Στη συνέχεια, εάν πληκτρολογήσετε ένα μήνυμα στο κανάλι διακομιστή, θα πρέπει να εμφανίζεται στα αρχεία καταγραφής της γραμμής εντολών ως εξής:

> node src/index.js Logged in! Message received! Contents: Test

Τέλος, έχουμε δημιουργήσει τα θεμέλια: Τύποι TypeScript και ένα δοχείο έγχυσης εξάρτησης μέσα στο bot μας.

Εφαρμογή επιχειρησιακής λογικής

Ας πάμε κατευθείαν στον πυρήνα αυτού του άρθρου: δημιουργία δοκιμαστικής βάσης κώδικα. Εν ολίγοις, ο κώδικάς μας πρέπει να εφαρμόζει βέλτιστες πρακτικές (όπως ΣΤΕΡΕΟΣ ), όχι απόκρυψη εξαρτήσεων, μη χρήση στατικών μεθόδων.

Επίσης, Δεν πρέπει να προκαλεί παρενέργειες κατά την εκτέλεση και να είναι ευπαθή .

Για λόγους απλότητας, το bot μας θα κάνει μόνο ένα πράγμα: Θα αναζητήσει εισερχόμενα μηνύματα και αν κάποιος περιέχει τη λέξη 'ping', θα χρησιμοποιήσουμε μία από τις διαθέσιμες εντολές Discord bot για να κάνουμε το bot να ανταποκριθεί με το 'pong! ' σε αυτόν τον χρήστη.

Για να δείξετε πώς να κάνετε ένεση προσαρμοσμένων αντικειμένων στο Bot Αντικείμενο και δοκιμή μονάδας, θα δημιουργήσουμε δύο κατηγορίες: PingFinder και MessageResponder. Θα εγχύσουμε MessageResponder στο Bot τάξη και PingFinder σε MessageResponder.

Εδώ είναι το src/services/ping-finder.ts αρχείο:

import {injectable} from 'inversify'; @injectable() export class PingFinder { private regexp = 'ping'; public isPing(stringToSearch: string): boolean { return stringToSearch.search(this.regexp) >= 0; } }

Έπειτα εισάγουμε αυτήν την τάξη στο src/services/message-responder.ts αρχείο:

import {Message} from 'discord.js'; import {PingFinder} from './ping-finder'; import {inject, injectable} from 'inversify'; import {TYPES} from '../types'; @injectable() export class MessageResponder { private pingFinder: PingFinder; constructor( @inject(TYPES.PingFinder) pingFinder: PingFinder ) { this.pingFinder = pingFinder; } handle(message: Message): Promise { if (this.pingFinder.isPing(message.content)) { return message.reply('pong!'); } return Promise.reject(); } }

Τέλος, εδώ είναι ένα τροποποιημένο Bot τάξη, η οποία χρησιμοποιεί το MessageResponder τάξη:

import {Client, Message} from 'discord.js'; import {inject, injectable} from 'inversify'; import {TYPES} from './types'; import {MessageResponder} from './services/message-responder'; @injectable() export class Bot { private client: Client; private readonly token: string; private messageResponder: MessageResponder; constructor( @inject(TYPES.Client) client: Client, @inject(TYPES.Token) token: string, @inject(TYPES.MessageResponder) messageResponder: MessageResponder) { this.client = client; this.token = token; this.messageResponder = messageResponder; } public listen(): Promise { this.client.on('message', (message: Message) => { if (message.author.bot) { console.log('Ignoring bot message!') return; } console.log('Message received! Contents: ', message.content); this.messageResponder.handle(message).then(() => { console.log('Response sent!'); }).catch(() => { console.log('Response not sent.') }) }); return this.client.login(this.token); } }

Σε αυτήν την κατάσταση, η εφαρμογή θα αποτύχει επειδή δεν υπάρχουν ορισμοί για το MessageResponder και PingFinder τάξεις. Ας προσθέσουμε τα ακόλουθα στο inversify.config.ts αρχείο:

container.bind(TYPES.MessageResponder).to(MessageResponder).inSingletonScope(); container.bind(TYPES.PingFinder).to(PingFinder).inSingletonScope();

Επίσης, θα προσθέσουμε σύμβολα τύπου στο types.ts:

MessageResponder: Symbol('MessageResponder'), PingFinder: Symbol('PingFinder'),

Τώρα, μετά την επανεκκίνηση της εφαρμογής μας, το bot θα πρέπει να ανταποκρίνεται σε κάθε μήνυμα που περιέχει 'ping':

Το bot ανταποκρίνεται σε ένα μήνυμα που περιέχει τη λέξη

Και εδώ είναι πώς φαίνεται στα αρχεία καταγραφής:

> node src/index.js Logged in! Message received! Contents: some message Response not sent. Message received! Contents: message with ping Ignoring bot message! Response sent!

Δημιουργία δοκιμών μονάδας

Τώρα που έχουμε σωστά εγχύσεις εξαρτήσεων, είναι εύκολο να γράψεις τεστ μονάδας. Θα χρησιμοποιήσουμε το Chai και το ts-mockito για αυτό. Ωστόσο, υπάρχουν πολλοί άλλοι δοκιμαστικοί δρομείς και κοροϊδευτικές βιβλιοθήκες που θα μπορούσατε να χρησιμοποιήσετε.

Η κοροϊδευτική σύνταξη στο ts-mockito είναι αρκετά λεκτική, αλλά επίσης κατανοητή. Δείτε πώς μπορείτε να ρυθμίσετε το MessageResponder υπηρεσία και κάντε την ένεση PingFinder χλευάσουμε σε αυτό:

let mockedPingFinderClass = mock(PingFinder); let mockedPingFinderInstance = instance(mockedPingFinderClass); let service = new MessageResponder(mockedPingFinderInstance);

Τώρα που έχουμε δημιουργήσει χλευασμούς, μπορούμε να καθορίσουμε ποιο είναι το αποτέλεσμα του isPing() οι κλήσεις πρέπει να είναι και να επαληθεύονται reply() κλήσεις. Το θέμα είναι ότι στις δοκιμές μονάδας, ορίζουμε το αποτέλεσμα του isPing() κλήση: true ή false. Δεν έχει σημασία ποιο είναι το περιεχόμενο του μηνύματος, επομένως στις δοκιμές χρησιμοποιούμε απλώς 'Non-empty string'.

when(mockedPingFinderClass.isPing('Non-empty string')).thenReturn(true); await service.handle(mockedMessageInstance) verify(mockedMessageClass.reply('pong!')).once();

Δείτε πώς θα μπορούσε να μοιάζει ολόκληρη η δοκιμαστική σουίτα:

import 'reflect-metadata'; import 'mocha'; import {expect} from 'chai'; import {PingFinder} from '../../../src/services/ping-finder'; import {MessageResponder} from '../../../src/services/message-responder'; import {instance, mock, verify, when} from 'ts-mockito'; import {Message} from 'discord.js'; describe('MessageResponder', () => { let mockedPingFinderClass: PingFinder; let mockedPingFinderInstance: PingFinder; let mockedMessageClass: Message; let mockedMessageInstance: Message; let service: MessageResponder; beforeEach(() => { mockedPingFinderClass = mock(PingFinder); mockedPingFinderInstance = instance(mockedPingFinderClass); mockedMessageClass = mock(Message); mockedMessageInstance = instance(mockedMessageClass); setMessageContents(); service = new MessageResponder(mockedPingFinderInstance); }) it('should reply', async () => { whenIsPingThenReturn(true); await service.handle(mockedMessageInstance); verify(mockedMessageClass.reply('pong!')).once(); }) it('should not reply', async () => { whenIsPingThenReturn(false); await service.handle(mockedMessageInstance).then(() => { // Successful promise is unexpected, so we fail the test expect.fail('Unexpected promise'); }).catch(() => { // Rejected promise is expected, so nothing happens here }); verify(mockedMessageClass.reply('pong!')).never(); }) function setMessageContents() { mockedMessageInstance.content = 'Non-empty string'; } function whenIsPingThenReturn(result: boolean) { when(mockedPingFinderClass.isPing('Non-empty string')).thenReturn(result); } });

Οι δοκιμές για PingFinder είναι αρκετά ασήμαντα, καθώς δεν υπάρχουν εξαρτήσεις που πρέπει να κοροϊδεύονται. Ακολουθεί ένα παράδειγμα δοκιμαστικής περίπτωσης:

describe('PingFinder', () => { let service: PingFinder; beforeEach(() => { service = new PingFinder(); }) it('should find 'ping' in the string', () => { expect(service.isPing('ping')).to.be.true }) });

Δημιουργία δοκιμών ενοποίησης

Εκτός από τις δοκιμές μονάδας, μπορούμε επίσης να γράψουμε δοκιμές ολοκλήρωσης. Η κύρια διαφορά είναι ότι οι εξαρτήσεις σε αυτές τις δοκιμές δεν κοροϊδεύονται. Ωστόσο, υπάρχουν ορισμένες εξαρτήσεις που δεν πρέπει να δοκιμαστούν, όπως εξωτερικές συνδέσεις API. Σε αυτήν την περίπτωση, μπορούμε να δημιουργήσουμε χλευασμούς και rebind τους στο δοχείο, έτσι ώστε η ψεύτικη ένεση αντ 'αυτού. Ακολουθεί ένα παράδειγμα για το πώς να το κάνετε αυτό:

import container from '../../inversify.config'; import {TYPES} from '../../src/types'; // ... describe('Bot', () => { let discordMock: Client; let discordInstance: Client; let bot: Bot; beforeEach(() => { discordMock = mock(Client); discordInstance = instance(discordMock); container.rebind(TYPES.Client) .toConstantValue(discordInstance); bot = container.get(TYPES.Bot); }); // Test cases here });

Αυτό μας φέρνει στο τέλος του προγράμματος εκμάθησης bot Discord. Συγχαρητήρια, το φτιάξατε καθαρά, με την εφαρμογή TypeScript και DI από την αρχή! Αυτό το παράδειγμα έγχυσης εξάρτησης TypeScript είναι ένα μοτίβο που μπορείτε να προσθέσετε στο ρεπερτόριό σας για χρήση με οποιοδήποτε έργο.

TypeScript και Dependency Injection: Όχι μόνο για την ανάπτυξη Discord Bot

Φέρνοντας τον αντικειμενοστρεφή κόσμο του Τύπος γραφής Το JavaScript είναι μια εξαιρετική βελτίωση, είτε εργαζόμαστε για κώδικα front-end είτε back-end. Η χρήση μόνο των τύπων μας επιτρέπει να αποφύγουμε πολλά σφάλματα. Έχοντας έγχυση εξάρτησης στο TypeScript ωθεί ακόμη περισσότερο αντικειμενοστρεφείς βέλτιστες πρακτικές στην ανάπτυξη που βασίζεται σε JavaScript.

Φυσικά, λόγω των περιορισμών της γλώσσας, δεν θα είναι ποτέ τόσο εύκολο και φυσικό όσο στις στατικά δακτυλογραφημένες γλώσσες. Αλλά ένα πράγμα είναι σίγουρο: Το TypeScript, οι δοκιμές μονάδας και η έγχυση εξάρτησης μάς επιτρέπουν να γράφουμε πιο αναγνώσιμο, χαλαρό συνδυασμό και διατηρήσιμο κώδικα - ανεξάρτητα από το είδος της εφαρμογής που αναπτύσσουμε.

Σχετίζεται με: Δημιουργήστε ένα WhatsApp Chatbot, όχι μια εφαρμογή

Κατανόηση των βασικών

Γιατί πρέπει να χρησιμοποιώ ένεση εξάρτησης;

Θα πρέπει να χρησιμοποιήσετε το μοτίβο σχεδίασης έγχυσης εξάρτησης εάν θέλετε να γράψετε καθαρότερο κώδικα με την έννοια ότι μπορεί να ελεγχθεί από τη μονάδα, να είναι πιο συντηρήσιμο και χαλαρά συνδεδεμένο. Χρησιμοποιώντας ένεση εξάρτησης, έχετε μια συνταγή για καθαρότερο κώδικα χωρίς να ανακαλύψετε ξανά τον τροχό.

Ποια είναι τα οφέλη της ένεσης εξάρτησης;

Εφαρμόζοντας την εξάρτηση εξάρτησης, είμαστε αναγκασμένοι να γράψουμε έναν κωδικό με δυνατότητα δοκιμής μονάδας, ο οποίος είναι εύκολο να διατηρηθεί. Οι εξαρτήσεις εισάγονται μέσω κατασκευαστών και μπορούν εύκολα να κοροϊδεύονται σε δοκιμές μονάδας. Επίσης, αυτό το μοτίβο μας ενθαρρύνει να γράψουμε χαλαρά συνδεδεμένο κώδικα.

c corp vs s corp vs llc

Ποιος είναι ο σκοπός του TypeScript;

Ο κύριος σκοπός του TypeScript είναι να επιτρέψει καθαρότερο, πιο ευανάγνωστο κώδικα JavaScript προσθέτοντας τύπους. Είναι μια βοήθεια για προγραμματιστές, κυρίως χρήσιμο σε IDE. Κάτω από την κουκούλα, το TypeScript εξακολουθεί να μετατρέπεται σε απλή JavaScript.

Τι είναι το bot Discord;

Το Discord bot είναι μια εφαρμογή ιστού που χρησιμοποιεί το Discord API για επικοινωνία.

Τι μπορεί να κάνει ένα bot Discord;

Ένα bot Discord μπορεί να ανταποκριθεί σε μηνύματα, να εκχωρήσει ρόλους, να απαντήσει με αντιδράσεις και άλλα. Υπάρχουν μέθοδοι API για τυχόν ενέργειες Discord που μπορούν να εκτελέσουν οι τακτικοί χρήστες και διαχειριστές.

Ποια είναι τα οφέλη του TypeScript;

Το κύριο πλεονέκτημα του TypeScript είναι να επιτρέπει στον προγραμματιστή να καθορίζει και να χρησιμοποιεί τύπους. Χρησιμοποιώντας υποδείξεις τύπου, ο transpiler (ή 'μεταγλωττιστής πηγής προς πηγή') γνωρίζει τι είδους αντικείμενο πρέπει να περάσει σε μια δεδομένη μέθοδο. Τυχόν σφάλματα ή μη έγκυρες κλήσεις εντοπίζονται κατά τη στιγμή της μεταγλώττισης, γεγονός που οδηγεί σε λιγότερα σφάλματα σε έναν ζωντανό διακομιστή.

WebVR Μέρος 2: Web Workers και Browser Edge Computing

Διεπαφή Ιστού

WebVR Μέρος 2: Web Workers και Browser Edge Computing
Οπτικοποίηση δεδομένων - Βέλτιστες πρακτικές και θεμέλια

Οπτικοποίηση δεδομένων - Βέλτιστες πρακτικές και θεμέλια

Σχεδιασμός Διεπαφής Χρήστη

Δημοφιλείς Αναρτήσεις
Βέλτιστες πρακτικές σελίδας προορισμού (με Infographic)
Βέλτιστες πρακτικές σελίδας προορισμού (με Infographic)
Οκτώ λόγοι για τους οποίους η Microsoft Stack εξακολουθεί να είναι μια βιώσιμη επιλογή
Οκτώ λόγοι για τους οποίους η Microsoft Stack εξακολουθεί να είναι μια βιώσιμη επιλογή
Αιτιολόγηση επενδύσεων με τη διαδικασία προϋπολογισμού κεφαλαίου
Αιτιολόγηση επενδύσεων με τη διαδικασία προϋπολογισμού κεφαλαίου
Πάρτε το στο όριο - Μια επισκόπηση των ιστοτόπων Long Scroll
Πάρτε το στο όριο - Μια επισκόπηση των ιστοτόπων Long Scroll
Εφαρμογές περιβάλλοντος και σύνθετη αρχιτεκτονική επεξεργασίας συμβάντων
Εφαρμογές περιβάλλοντος και σύνθετη αρχιτεκτονική επεξεργασίας συμβάντων
 
Πράσινο για απογείωση - Μέσα στη βιομηχανία ηλεκτρικών αεροπλάνων
Πράσινο για απογείωση - Μέσα στη βιομηχανία ηλεκτρικών αεροπλάνων
Διαδικτυακό βίντεο με Wowza και Amazon Elastic Transcoder
Διαδικτυακό βίντεο με Wowza και Amazon Elastic Transcoder
Τα Dos and Don'ts of a Rebranding Strategy
Τα Dos and Don'ts of a Rebranding Strategy
Elasticsearch για Ruby on Rails: Ένα μάθημα για το Chewy Gem
Elasticsearch για Ruby on Rails: Ένα μάθημα για το Chewy Gem
Πώληση μιας επιχείρησης για μέγιστη αξία σε μια προκλητική αγορά M&A
Πώληση μιας επιχείρησης για μέγιστη αξία σε μια προκλητική αγορά M&A
Δημοφιλείς Αναρτήσεις
  • πώς να ανταποκρινόμαστε στον σχεδιασμό ιστοσελίδων
  • πώς να χρησιμοποιήσετε ένα bot σε διαφωνία
  • πώς να διεξάγετε δοκιμές χρήστη
  • τι αναζητούν οι επενδυτές
  • χρησιμοποιήστε το raspberry pi ως διακομιστή ιστού
  • πλεονεκτήματα εταιρικής σχέσης έναντι εταιρικού φόρου
Κατηγορίες
  • Σχεδιασμός Ux
  • Συμβουλές Και Εργαλεία
  • Σχεδιασμός Διεπαφής Χρήστη
  • Επενδυτές & Χρηματοδότηση
  • © 2022 | Ολα Τα Δικαιώματα Διατηρούνται

    portaldacalheta.pt