実甚的な原則SlackからTwilioたで



今日では、 RESTful APIが完党に存圚するようです。 支払いから予玄テヌブル、簡単な通知から仮想マシンの展開たで-ほがすべおが簡単なHTTPむンタラクションを通じお利甚できたす。

独自のサヌビスを開発しおいる堎合、倚くの堎合、耇数のプラットフォヌムで同時に動䜜するようにしたいこずがありたす。 OODオブゞェクト指向蚭蚈の昔からの原則により、コヌドの埩元力が高たり、拡匵性が簡玠化されたす。

この蚘事では、SOLIDこれは頭字語ですず呌ばれる特定の蚭蚈アプロヌチを怜蚎したす。 Slack統合を䜿甚しおサヌビスを䜜成する際に実際に䜿甚し、 Twilioで䜿甚するために拡匵したす。

このサヌビスは、マゞックザギャザリングカヌドをランダムに送信したす。 今すぐ動䜜を確認したい堎合は、 マゞックずいう蚀葉を1-929-236-9306に送信したす米囜ずカナダのみ-MMS経由で画像を受信するため、オペレヌタヌの料金が適甚される堎合がありたす。 こちらをクリックしお、Slack組織に参加するこずもできたす 。 ログむン埌、 / magicず入力したす。

SOLID for Magic


SOLIDを初めお䜿甚する堎合、これはボブ・マヌティンおじさんが普及させたオブゞェクト指向蚭蚈OODの原則のセットです。 SOLIDは以䞋の頭字語です。


この䞀連の原則に埓うず、コヌドのフォヌルトトレランスが向䞊し、拡匵性が簡玠化されたす。 蚘事の埌半で、これらの各原則に぀いお詳しく説明したす。

さたざたな蚀語の倚くの良い䟋がありたす。 有名なShape 、 Circle 、 Rectangle 、 Area䟋を繰り返す代わりに、実䞖界の完党に機胜するアプリケヌションでSOLIDの利点を瀺したいず思いたす。

私は最近Slack APIでプレむしたした。 スラッシュを䜿甚しお独自のチヌムを䜜成するのは非垞に簡単です。 私はマゞックザギャザリングの倧ファンでもあるので、マゞックザギャザリングのランダムカヌドの画像を生成するSlackスラッシュコマンドを䜜成するずいうアむデアを思い぀きたした。

私はすぐにSpring Bootで蚈画を実行したした。 埌で芋るように、Spring Bootはすぐに䜿甚できるいく぀かの固い原則に埓いたす。

Twilioには、優れた音声およびテキストメッセヌゞングAPIがありたす。 Slackの䟋を取り䞊げおTwilioず統合するこずがどれほど簡単かを芋るのは面癜いず思いたした。 アむデアは、チヌムずテキストメッセヌゞを既知の電話番号に送信し、マゞックザギャザリングのランダムな画像を取埗するこずです。

以䞋は、このプログラミング挔習䞭の実際の動䜜䞭のSOLID原則故障の内蚳です。

すべおのコヌドはここにありたす 。 必芁に応じお、このコヌドをご自身のSlackやTwilioアカりントに適甚する方法に぀いおは埌ほど説明したす。

最初の実行Slackを䜿甚したマゞック


Spring Bootを䜿甚しおMagicアプリケヌションを䜜成するずいう事実だけで、特別な劎力をかけるこずなく、5぀のSOLID原則のうち2぀が即座に提䟛されたす。 ただし、正しいアプリケヌションアヌキテクチャに぀いおは匕き続き責任がありたす。

コヌドの䜜成プロセスでさたざたな原則を孊習するため、GitHubプロゞェクトで察応するタグを確認するこずで、い぀でもコヌドサンプルを芋るこずができたす「リリヌス」セクションで確認できたす。 この章の完党なコヌドは、 slack-first-passタグで衚瀺されたす。

SlackControllerコヌドを芋おみたしょうすべおのJava゜ヌスはここにありたすmagic-app / src / main / java / com / afitnerd / magic。これはSOLIDのDずI原則の䟋です。

 @RestController @RequestMapping("/api/v1") public class SlackController { @Autowired MagicCardService magicCardService; @Autowired SlackResponseService slackResponseService; @RequestMapping( value = "/slack", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE ) public @ResponseBody Map<String, Object> slack(@RequestBody SlackSlashCommand slackSlashCommand) throws IOException { return slackResponseService.getInChannelResponseWithImage(magicCardService.getRandomMagicCardImage()); } } 

DIP䟝存関係の逆転の原則


DIPの原理は次のずおりです。

A.䞊䜍レベルのモゞュヌルは、䞋䜍レベルのモゞュヌルに䟝存しないようにしおください。 どちらのタむプのモゞュヌルも抜象化に䟝存する必芁がありたす。

B.抜象化は詳现に䟝存するべきではありたせん。 詳现は抜象化に䟝存する必芁がありたす。

JavaずSpring Bootを䜿甚するず、この原則を非垞に簡単に実装できたす。 SlackController *実装* MagicCardServiceサヌビス。 これは、Javaむンタヌフェヌスであるため、*抜象化*です。 これはむンタヌフェヌスであるため、詳现はありたせん。

MagicCardServiceの実装はMagicCardServiceたせん。 埌ほど、アプリケヌションをモゞュヌルに分割しお、むンタヌフェむスずその実装をこのように分離する方法を確認したす。 Spring Bootで䟝存関係を実装する他の珟代的な方法を芋おいきたす。

ISPむンタヌフェヌス分離の原理


ISPの原則は次のように述べおいたす。

倚くの個別のクラむアントむンタヌフェむスは、1぀のナニバヌサルむンタヌフェむスよりも優れおいたす。

SlackController MagicCardServiceずSlackResponseService 2぀の個別のむンタヌフェむスを実装しSlackResponseService 。 それらの1぀は、マゞックザギャザリングのサむトず察話したす。 別の人はSlackず察話したす。 これら2぀の個別の機胜を実行する単䞀のむンタヌフェむスを䜜成するず、ISPの原則に違反したす。

次Twilioでの「マゞック」


この章のコヌドを远跡するには、 twilio-breaks-srpタグを参照しおください。

TwilioControllerコヌドを芋おください

 @RestController @RequestMapping("/api/v1") public class TwilioController { private MagicCardService magicCardService; static final String MAGIC_COMMAND = "magic"; static final String MAGIC_PROXY_PATH = "/magic_proxy"; ObjectMapper mapper = new ObjectMapper(); private static final Logger log = LoggerFactory.getLogger(TwilioController.class); public TwilioController(MagicCardService magicCardService) { this.magicCardService = magicCardService; } @RequestMapping(value = "/twilio", method = RequestMethod.POST, headers = "Accept=application/xml", produces=MediaType.APPLICATION_XML_VALUE) public TwilioResponse twilio(@ModelAttribute TwilioRequest command, HttpServletRequest req) throws IOException { log.debug(mapper.writeValueAsString(command)); TwilioResponse response = new TwilioResponse(); String body = (command.getBody() != null) ? command.getBody().trim().toLowerCase() : ""; if (!MAGIC_COMMAND.equals(body)) { response .getMessage() .setBody("Send\n\n" + MAGIC_COMMAND + "\n\nto get a random Magic the Gathering card sent to you."); return response; } StringBuffer requestUrl = req.getRequestURL(); String imageProxyUrl = requestUrl.substring(0, requestUrl.lastIndexOf("/")) + MAGIC_PROXY_PATH + "/" + magicCardService.getRandomMagicCardImageId(); response.getMessage().setMedia(imageProxyUrl); return response; } @RequestMapping(value = MAGIC_PROXY_PATH + "/{card_id}", produces = MediaType.IMAGE_JPEG_VALUE) public byte[] magicProxy(@PathVariable("card_id") String cardId) throws IOException { return magicCardService.getRandomMagicCardBytes(cardId); } } 

前に述べたように、䞭毒の実装にはより珟代的なアプロヌチを適甚したすベストプラクティス。 ご芧のずおり、Spring Boot Constructor Injectionでこれを行いたした。 これは、Spring Bootの最新バヌゞョンでは、䟝存関係の泚入が次のように行われるこずを瀺す良い方法です。

1.クラスに1぀以䞊の非衚瀺フィヌルドを蚭定したす。次に䟋を瀺したす。

 private MagicCardService magicCardService; 

2.セットの非衚瀺フィヌルドのコンストラクタヌを定矩したす。

 public TwilioController(MagicCardService magicCardService) { this.magicCardService = magicCardService; } 

Spring Bootは、実行時にオブゞェクトの実装を自動的に凊理したす。 利点は、ここで、コンストラクタヌ内の埋め蟌みオブゞェクトで゚ラヌチェックず怜蚌を実行できるこずです。

コントロヌラヌには、 /twilioず/magic_proxy/{card_id} 2぀の郚分が含たれおいたす。 magic_proxyパスには少し説明が必芁なので、たずSRPの原則に違反するこずに぀いお説明する前に説明したす。

TwiMLをお楜しみください


TwiMLはTwilioマヌクアップ蚀語です。 TwiMLはTwilioの指瀺であるため、これはすべおのTwilioの回答の基瀎です。 たた、XMLです。 通垞、これは問題ではありたせん。 ただし、Magic the Gatheringサむトから返されるURLは、TwiMLドキュメントに含めるには問題がありたす。

Magic the Gatheringマップ画像が抜出されるURLは次のようになりたす。

 http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=144276&type=card 

URLのアンパサンドに泚意しおください。 アンパサンドをXMLドキュメントに埋め蟌むには、2぀の有効な方法しかありたせん。

1.゚スケヌプ文字

 <Response> <Message> <Body/> <Media>http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=144276&​amp;type=card</Media> </Message> </Response> 

ここでは、アンパサンドの代わりに、 &​amp; 。

2. CDATAフラグメント文字デヌタ

 <Response> <Message> <Body/> <Media> <![CDATA[http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=144276&type=card]]> </Media> </Message> </Response> 

これらのオプションはいずれも、Spring Bootに組み蟌たれたJackson JSONプロセッサヌのJackson Dataformat XML拡匵機胜を䜿甚しお、Javaで簡単に実装できたす。

問題は、Wizards of the Coast Webサむトマゞックザギャザリングメンテナヌから画像を受信するずきに最初のオプションが゚ラヌになり、Twilioでは2番目のオプションがサポヌトされないこずですちょっずTwilioTwiMLでCDATAサポヌトを実装したすか

リク゚ストのプロキシを䜿甚しおこの制限を回避したした。 この堎合、TwiMLコヌドが生成されたす

 <Response> <Message> <Body/> <Media> http://<my magic host>/api/v1/magic_proxy/144276 </Media> </Message> </Response> 

このようなコヌドを受け取るず、Twilioぱンドポむント/magic_proxy参照し、すでに舞台裏でプロキシがMagic the Gathering Webサむトから画像を受信しお​​発行したす。

珟圚、SOLIDの原理の研究を続けおいたす。

SRP単独の責任原則


SRPの原則は次のずおりです。

クラスには1぀の関数のみが必芁です。

䞊蚘のコントロヌラヌはそのたた動䜜したすが、TwiML応答ず画像のプロキシの䞡方を返すため、SRPに違反したす。

この䟋ではこれは倧きな問題ではありたせんが、状況がすぐに手に負えなくなるこずは容易に想像できたす。

twilio-fixes-srpタグに埓うず、 twilio-fixes-srpず呌ばれる新しいコントロヌラヌが衚瀺されMagicCardProxyController 。

 @RestController @RequestMapping("/api/v1") public class MagicCardProxyController { private MagicCardService magicCardService; public MagicCardProxyController(MagicCardService magicCardService) { this.magicCardService = magicCardService; } @RequestMapping(value = MAGIC_PROXY_PATH + "/{card_id}", produces = MediaType.IMAGE_JPEG_VALUE) public byte[] magicProxy(@PathVariable("card_id") String cardId) throws IOException { return magicCardService.getRandomMagicCardBytes(cardId); } } 

その唯䞀のタスクは、Magic the Gathering Webサむトからプロキシで受信した画像のバむトを返すこずです。

珟圚、唯䞀のTwilioController関数はTwiMLコヌドを発行するこずです。

DIP実装甚のモゞュヌル


Mavenを䜿甚するず、プロゞェクトをモゞュヌルに簡単に分割できたす。 スコヌプは異なっおいおもかたいたせんが、コンパむルデフォルト、実行、テストずいう同じスコヌプがありたす。

モゞュヌルがその゚リアでアクティブになるず、゚リアが制埡を取埗したす。 runtimeスコヌプは、特定のモゞュヌルのクラスがコンパむル時に*利甚できない*こずを確認したす。 それらは実行時にのみ利甚可胜です。 これは、DIP原則の実装に圹立ちたす。

䟋で簡単に衚瀺できたす。 modules-ftwタグのコヌドを確認しおください。 プロゞェクトの構成が根本的に倉曎されたこずがわかりたすIntelliJで芋られるように。



珟圚、4぀のモゞュヌルがありたす。 magic-appモゞュヌルを芋るず、 pom.xmlから他のモゞュヌルにどのように䟝存しおいるかがわかりたす。

 <dependencies> ... <dependency> <groupId>com.afitnerd</groupId> <artifactId>magic-config</artifactId> </dependency> <dependency> <groupId>com.afitnerd</groupId> <artifactId>magic-api</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>com.afitnerd</groupId> <artifactId>magic-impl</artifactId> <scope>runtime</scope> </dependency> </dependencies> 

magic-implはruntimeにあり、 magic-apiはcompileこずに泚意しおください。

TwilioController自動的にバむンドしたす。

 @RestController @RequestMapping(API_PATH) public class TwilioController { private TwilioResponseService twilioResponseService; 
 } 

実装されたクラスをこの方法で自動的にバむンドしようずするずどうなるか芋おみたしょう。

 @RestController @RequestMapping(API_PATH) public class TwilioController { private TwilioResponseServiceImpl twilioResponseService; 
 } 



IntelliJはTwilioResponseServiceImplクラスを芋぀けるこずができたせん。これは、 compileスコヌプ内に*ない*ためです。

楜しみのために、 pom.xmlからruntime行を削陀しおみおくださいTwilioResponseServiceImplクラスを芋぀けおTwilioResponseServiceImplこずがTwilioResponseServiceImplたす。

これたで芋おきたように、mavenモゞュヌルずスコヌプを組み合わせるこずで、DIPの原則を実装できたす。

フィニッシュラむンスラックリファクタリング


このアプリケヌションを初めお䜜成したずき、SOLIDに぀いおは考えたせんでした。 Slackアプリをハックしお、スラッシュコマンドの機胜を操䜜したかっただけです。

最初のバヌゞョンでは、すべおのSlack関連のサヌビスずコントロヌラヌはMap<String, Object>返したした。 これは、Spring Bootアプリケヌションにずっお良いトリックです。応答の構造を衚す正匏なJavaモデルを心配するこずなく、JSON応答を発行できたす。

アプリケヌションの開発に䌎い、読み取り可胜で信頌性の高いコヌドのより正匏なモデルを䜜成したいずいう芁望がありたした。

slack-violates-lspの゜ヌスコヌドを参照しおください。

magic-apiモゞュヌルのSlackResponseクラスを芋おみたしょう。

 public abstract class SlackResponse { private List<Attachment> attachments = new ArrayList<>(); @JsonInclude(JsonInclude.Include.NON_EMPTY) public List<Attachment> getAttachments() { return attachments; } @JsonInclude(JsonInclude.Include.NON_NULL) public abstract String getText(); @JsonProperty("response_type") public abstract String getResponseType(); ... } 

ここで、 SlackResponseクラスにはAttachments配列、テキスト文字列、およびresponse_type文字列があるこずがSlackResponseたす。

SlackResponseは型abstract宣蚀し、 getTextおよびgetResponseTypeメ゜ッドの実装関数は子クラスに分類されたす。

SlackInChannelImageResponse子クラスの1぀を芋おみたしょう。

 public class SlackInChannelImageResponse extends SlackResponse { public SlackInChannelImageResponse(String imageUrl) { getAttachments().add(new Attachment(imageUrl)); } @Override public String getText() { return null; } @Override public String getResponseType() { return "in_channel"; } } 

getText()メ゜ッドはnull返しnull 。 この回答では、回答には*画像のみが含たれたす。 テキストは、゚ラヌメッセヌゞの堎合にのみ返されたす。 ここ*明らかに* LSPのにおいがしたす。

LSPバヌバラリスク代替原理


LSPの原則は次のずおりです。

プログラム内のオブゞェクトは、プログラムの粟床を倉曎せずにサブタむプに眮き換えるこずができる必芁がありたす。

継承階局を凊理しおいお、子クラス*が垞に* nullを返す堎合、これはLSP原則違反の明確な兆候です。 子クラスにはこのメ゜ッドは必芁ありたせんが、芪クラスに蚘述されおいるむンタヌフェむスのために実装する必芁があるためです。

GitHubプロゞェクトのmasterブランチをご芧ください。 そこで、 SlackResponse階局はLSPに䞀臎するようにSlackResponseれたした。

 public abstract class SlackResponse { @JsonProperty("response_type") public abstract String getResponseType(); } 

これで、実装する必芁があるすべおの子クラスに共通する唯䞀のものはgetResponseType()メ゜ッドです。

SlackInChannelImageResponseクラスには、正解に必芁なすべおの写真が含たれおいたす。

 public class SlackInChannelImageResponse extends SlackResponse { private List<Attachment> attachments = new ArrayList<>(); public SlackInChannelImageResponse(String imageUrl) { attachments.add(new Attachment(imageUrl)); } public List<Attachment> getAttachments() { return attachments; } @Override public String getResponseType() { return "in_channel"; } 
 } 

再びnullを返す必芁はありたせん。

もう1぀小さな改善がありたす。以前、 SlackResponseクラスにいく぀かのJSONアノテヌションがありSlackResponse 。 @JsonInclude(JsonInclude.Include.NON_EMPTY)ず@JsonInclude(JsonInclude.Include.NON_NULL)です。

倀がれロの空の添付ファむル配列たたはテキストフィヌルドがJSONに入らないこずを保蚌するために必芁でした。 これらは匷力な泚釈ですが、そのため、モデルのオブゞェクトは脆匱になり、他の開発者には䜕が起こっおいるのかがはっきりしない堎合がありたす。

OCPオヌプン/クロヌズド原則


SOLIDでの旅の最埌の原則はOCPです。

OCPの原則は次のずおりです。

゜フトりェア゚ンティティ...は拡匵のために開かれおいる必芁がありたすが、倉曎のために閉じられおいる必芁がありたす。

考え方は、参照条件を倉曎するずき、クラスを拡匵し、既存のクラスにコヌドを远加しない堎合、コヌドは新しい芁件により効果的に察凊するずいうこずです。 これにより、コヌドが忍び寄るのを防ぎたす。

䞊蚘の䟋では、 SlackResponseクラスを倉曎する远加の理由はありたせん。 他のタむプのSlack回答タむプのサポヌトをアプリケヌションに远加する堎合、この特異性をサブクラスで簡単に説明できたす。

ここでも、Spring Bootの匷さは明らかです。 magic-impl SlackResponseServiceImplクラスを芋おください。

 @Service public class SlackResponseServiceImpl implements SlackResponseService { MagicCardService magicCardService; public SlackResponseServiceImpl(MagicCardService magicCardService) { this.magicCardService = magicCardService; } @Override public SlackResponse getInChannelResponseWithImage() throws IOException { return new SlackInChannelImageResponse(magicCardService.getRandomMagicCardImageUrl()); } @Override public SlackResponse getErrorResponse() { return new SlackErrorResponse(); } } 

むンタヌフェヌスによるず、 getInChannelResponseWithImageおよびgetErrorResponseはSlackResponseオブゞェクトを返したす。

これらのメ゜ッド内で、さたざたなSlackResponse子オブゞェクトがSlackResponseたす。 Spring BootずJSONに組み蟌たれおいるjackson-mapperは、特定のオブゞェクトに察しお正しいJSONを生成するのに十分なほどスマヌトであり、これは内郚的に特城付けられおいたす。

Slackで組織に統合を提䟛するか、Twilioアカりントのサポヌトたたはその䞡方を実装する堎合は、先に進んでください それ以倖の堎合は、蚘事の最埌にある履歎曞にアクセスできたす。

アプリケヌションの展開


このアプリケヌションを最倧限に䜿甚する堎合は、Herokuにアプリケヌションをデプロむした埌、SlackずTwilioを適切に構成する必芁がありたす。

たたは、SlackたたはTwilioをむンストヌルできたす。 いずれの堎合でも、最初に行う必芁があるのは、アプリケヌションをHerokuにデプロむするこずです。 幞いなこずに、それは簡単です。

Herokuの展開


アプリケヌションをHerokuにデプロむする最も簡単な方法は、GitHubプロゞェクトのREADMEセクションにある玫色のフレンドリヌなボタンをクリックするこずです。 BASE_URLずSLACK_TOKENS 2぀の詳现を指定する必芁がありたす。

BASE_URLは、Herokuアプリケヌションの完党なパスず名前です。 たずえば、 https  //random-magic-card.herokuapp.comにアプリケヌションをむンストヌルしおいたす 。 アプリケヌション名を遞択するずきは、 https://<app name>.herokuapp.comず同じ圢匏に埓いhttps://<app name>.herokuapp.com 。

HerokuにはSlackからの情報が必芁であり、Slackの統合にはHerokuに぀いおの情報が必芁であるため、ここには鶏卵に関する問題がありたす。 最初は、デフォルト倀をSLACK_TOKENSフィヌルドに残しおおくこずができたす。埌でこの倀を返し、珟圚のSlack APIトヌクンで曎新したす。

https://<app name>.herokuapp.comしお、むンストヌルを確認できhttps://<app name>.herokuapp.com 。 ブラりザにマゞックザギャザリングマップがランダムに衚瀺されたす。 ゚ラヌが発生した堎合は、HerokuアプリケヌションのWebむンタヌフェむスで゚ラヌログを確認しおください。 動䜜䞭のWebむンタヌフェむスの䟋を次に瀺したす 。

スラックのセットアップ


https://api.slack.com/appsに移動し、[ Create New AppのCreate New App ]ボタンをクリックしお開始したす。



名前App Nameを入力し、アプリケヌションを远加するWorkspaceを遞択したす。



次に、巊偎のスラッシュコマンドSlash Commandsリンクをクリックしたす。新しいコマンドを䜜成するためのボタンがありたす新しいコマンドのCreate New Command 



コマンドの倀䟋 /magic 、 Request URL 䟋 https://<your app name>.herokuapp.com/api/v1/slack および短い説明を入力したす。 次に[ Save ]をクリックしSave 。



Slackのスラッシュコマンドが完党に構成されたした。



巊ペむンのInstall app to your workspace section Basic Informationセクションに移動し、画面䞊のInstall app to your workspace sectionにInstall app to your workspace sectionのInstall app to your workspace sectionを展開したす。 [ Install app to Workspace ]ボタンをクリックしたす。



次に、承認のためのボタン



戻ったBasic Information画面たでスクロヌルし、怜蚌トヌクンを蚘録したす。



Heroku CLIをむンストヌルした堎合、次のコマンドでSLACK_TOKENSプロパティSLACK_TOKENS正しく蚭定できたす。

 heroku config:set \ SLACK_TOKENS=<comma separated tokens> \ --app <your heroku app name> 

たたは、 Herokuダッシュボヌドに移動し、アプリケヌションに移動しお、蚭定のSLACK_TOKENS倀を倉曎したす。

これで、組織のSlackチャンネルでスラッシュコマンドが機胜するはずです。その代わりに、マゞックザギャザリングカヌドを受け取りたす。



Twilioのセットアップ


Twilio統合を構成するには、コン゜ヌルのTwilioダッシュボヌドに移動したす。



省略蚘号をクリックしお、 Programmable SMSを遞択したす。



Messaging Services遞択しMessaging Services 。



赀いプラスの付いたボタンをクリックしお、新しいメッセヌゞングサヌビスを䜜成したすサヌビスがただない堎合は[新しいメッセヌゞングサヌビスの䜜成]をクリックしたす。



Friendly Name入力し、[ Use Case ]列で[ Notifications, 2-Way Friendly Nameを遞択し、[ Create ]をクリックしCreate 。



Process Inbound Messagesチェックマヌクを確認し、HerokuアプリケヌションのRequest URLをRequest URLしたす䟋https://<your app name>.herokuapp.com/api/v1/twilio 



[ Save ]ボタンをクリックしお、倉曎を保存したす。

巊メニュヌの[ Numbersセクションに移動し、メッセヌゞングサヌビスにTwilio番号が远加されおいるこずを確認したす。



これで、 magicずいう単語を番号にテキストメッセヌゞずしお送信しお、Twilioサヌビスをテストできたす。



**泚**倧文字ず小文字を問わず、 magicずいう単語以倖を送信するず、䞊蚘の゚ラヌメッセヌゞが衚瀺されたす。

゜リッドサマリヌ


もう䞀床、SOLIDテヌブルを公開したす。今回は、各原則に䞀臎するGithubプロゞェクトタグを䜿甚したす。


このアプリケヌションの開発にはいく぀かの困難がありたす。TwiMLの問題に぀いおは、すでに䞊で述べたした。しかし、Slackには、この蚘事で説明した特別な問題がありたす。TL; DRSlackはapplication/x-www-form-urlencoded、最新のコマンドではなく、スラッシュコマンドの*のみ* POSTリク゚ストを受け入れたすapplication/json。これにより、Spring BootでJSON入力を凊理するこずが難しくなりたす。

基本的な考え方は、SOLIDの原則により、コヌドの䜜業ず拡匵がはるかに簡単になるずいうこずです。

これで、SOLID原則の抂芁は終わりです。通垞の単玔なJavaの䟋よりも䟿利であるこずを願っおいたす。

Source: https://habr.com/ru/post/J343966/


All Articles