{
    "id": 116,
    "date": "2022-06-03T15:18:00",
    "date_gmt": "2022-06-03T13:18:00",
    "guid": {
        "rendered": "http:\/\/s916043165.online.de\/?p=116"
    },
    "modified": "2022-07-18T16:13:36",
    "modified_gmt": "2022-07-18T14:13:36",
    "slug": "das-command-pattern-am-beispiel-von-sport-games",
    "status": "publish",
    "type": "post",
    "link": "https:\/\/janus.rs\/de\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/",
    "title": {
        "rendered": "Das Command Pattern in Sport Games"
    },
    "content": {
        "rendered": "<p>Das Command Pattern z\u00e4hlt zu meinen Favoriten unter den Design Patterns, daher wollte ich schon l\u00e4nger einen Artikel dazu verfassen.. Nach einer kurzen allgemeinen Erkl\u00e4rung des Pattern werden wir eine Handball Simulation als Anwendungsbeispiel betrachten. Damit ist es uns m\u00f6glich Potentiale des Pattern hervorzuheben, die sonst wenig thematisiert werden.<\/p>\n\n\n\n<p>Eine \u00dcbersicht \u00fcber einige wenige Patterns findet ihr in meinem Vortrag zum Thema Design Patterns auf Youtube (TBP, engl.), den ich im April 2022 f\u00fcr Software-nahe Bio- und Chemieingenieure an der TU Dortmund gehalten habe. Au\u00dferdem empfehle ich die B\u00fccher [1] &#8220;<em>Design Patterns: Elements of Reusable Object-Oriented Software<\/em>.&#8221; von der &#8220;Gang of Four&#8221;, sowie [2] <em>&#8220;Refactoring: Improving the Design of Existing Code<\/em>.&#8221; von Martin Fowler.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Motivation<\/h2>\n\n\n\n<p>Wir werden Objekte zum Kapseln von Aktionen verwenden. Damit decken wir mehrere Requirements ab, die in der Softwareentwicklung auftreten k\u00f6nnen:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Gleiche Aktionen verschiedenen Ausl\u00f6ser. (Z.B. User Eingaben, Netzwerkanfragen, wiederkehrende Aktionen wie Autosave.)<\/li><li>Die Sequenzen einfacher Aktionen kann verwendet werden um eine komplexere Aktion umzusetzen. <\/li><li>Es kann gew\u00fcnscht sein eine Aktion zu einem sp\u00e4teren Zeitpunkt auszuf\u00fchren. <\/li><li>Es kann gew\u00fcnscht sein eine Aktion wieder r\u00fcckg\u00e4ngig zu machen.<\/li><\/ol>\n\n\n\n<p>Wichtig ist auch die Einhaltung des SRP (Single Responsibility Principle). Mit Hilfe des Command Pattern trennen wir die Daten die f\u00fcr eine Aktion n\u00f6tig sind von der Implementierung ihrer Funktionalit\u00e4t und vereinheitlichen so das Erzeugen von Aktionen an verschiedenen Stellen in unserer Codebase.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Klassisches Beispiel des Command Pattern als UML Diagramm<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"600\" src=\"https:\/\/i0.wp.com\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png?resize=640%2C600\" alt=\"\" class=\"wp-image-146\" srcset=\"https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png?w=640&amp;ssl=1 640w, https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png?resize=300%2C281&amp;ssl=1 300w, https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png?resize=13%2C12&amp;ssl=1 13w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><figcaption>Klassisches Beispiel f\u00fcr ein Command Pattern von refactoring.guru <a rel=\"noreferrer noopener\" href=\"https:\/\/refactoring.guru\/design-patterns\/command\" target=\"_blank\">[3]<\/a><\/figcaption><\/figure>\n\n\n\n<p>Ein klassisches Beispiel f\u00fcr die Anwendung des Command Pattern ist ein Editor. Dabei \u00fcbernehmen in einem Editor die <em>Buttons <\/em>und <em>Shortcuts <\/em>das Aufrufen, bzw. Erzeugen von <em>Commands<\/em>. Sie sind also Sender\/Aufrufer. In dem Diagramm ist das <em>Application <\/em>Objekt verantwortlich f\u00fcr die Ausf\u00fchrung und ist damit der einzige Empf\u00e4nger. Die einzelnen Aktionen, <em>Copy, Cut, Paste und Undo<\/em> implementieren die gemeinsame Schnittstelle <em>Command<\/em>. Mit Hilfe eines stapelartigen Containers <em>CommandHistory <\/em>wird eine Historie von Aktionen gespeichert und die <em>Undo <\/em>Funktionalit\u00e4t umgesetzt.  <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Anwendungsbeispiele: Handball Sportspiel<\/h2>\n\n\n\n<p>Statt des klassischen Beispiels &#8220;Editor&#8221; m\u00f6chte ich hier tiefer auf M\u00f6glichkeiten f\u00fcr Computerspiele, im speziellen in einem Sportspiel, eingehen. Eine Undo Funktion brauchen wir nicht, aber wir nehmen an, dass uns das Game folgende Reqiurements vorgibt.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Die Simulation erfolgt in diskreten Zeitschritten<\/li><li>Spieler, bzw. ihre Eingabeger\u00e4te und die KI k\u00f6nnen Aktionen erzeugen<\/li><li>Wiederholung von H\u00f6hepunkten, wie z.B. ein Tor<\/li><li>KI-Entwicklung und Analyse<\/li><\/ul>\n\n\n\n<p>Wir verwenden das folgende Diagramm mit einer \u00e4hnlichen Struktur wie oben.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"591\" height=\"554\" src=\"https:\/\/i0.wp.com\/tjanus.de\/wp-content\/uploads\/2022\/07\/command_for_handball.png?resize=591%2C554\" alt=\"\" class=\"wp-image-167\" srcset=\"https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2022\/07\/command_for_handball.png?w=591&amp;ssl=1 591w, https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2022\/07\/command_for_handball.png?resize=300%2C281&amp;ssl=1 300w, https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2022\/07\/command_for_handball.png?resize=13%2C12&amp;ssl=1 13w\" sizes=\"auto, (max-width: 591px) 100vw, 591px\" \/><figcaption>Command Beispiel umgem\u00fcnzt auf ein Handball Computerspiel<\/figcaption><\/figure>\n\n\n\n<p>Wir gehen jetzt genauer auf die Requirements ein. Erstens, die Simulation in diskreten Zeitschritten z.B. dt=1.0 \/ 30.0 ist eine wichtige Annahme die Reprozierbarkeit erm\u00f6glicht, weil sonst numerische Berechnungen der Simulation von der vergangen Zeit abh\u00e4ngen. Das ist wichtig f\u00fcr andere Requirements, hat aber keinen direkten Einfluss auf das Pattern. <\/p>\n\n\n\n<p>Das zweite Requirement fordert, dass Aktionen von verschiedenen Sendern ausgehen k\u00f6nnen wie Eingabeger\u00e4te der Spieler, die KI und m\u00f6glicherweise Netzwerkpakete bei einem Onlinegame (nicht im Diagramm dargestellt). <\/p>\n\n\n\n<p>Das dritte Requirement ist nicht allein mit dem Command Pattern umsetzbar.. Ein separates <a rel=\"noreferrer noopener\" href=\"https:\/\/refactoring.guru\/design-patterns\/memento\" target=\"_blank\">Snapshot Pattern <\/a>(auch Memento), das z.B. auch f\u00fcr Savegames verwendet werden kann speichert alle relevanten Daten zu einem gewissen Zeitpunkt. In unserem Fall z.B. alle 30 Sekunden um Startpunkte f\u00fcr Wiederholungen parat zu haben. In der CommandHistory speichern wir eine Liste von Commands die dann f\u00fcr die Wiederholung erneut abgespielt werden. <\/p>\n\n\n\n<p>Das vierte Requirement offenbart die St\u00e4rke des Command Pattern. Neben einer Wiederholung von Highlights ist es auch auf dessen Basis m\u00f6glich Analysen durchzuf\u00fchren. Ein typisches Beispiel sind Spielz\u00fcge, die zu Bugs f\u00fchren oder Spielz\u00fcge, die zu h\u00e4ufig zum Erfolg f\u00fchren, weil die KI in dem Fall noch zu schwach ist. In Kombination mit dem Pseudo-Zufallszahlen Generator kann man entweder genau einen speziellen Bug reproduzieren, oder man simuliert den Spielzug sehr h\u00e4ufig um zu wissen zu welchen Prozentsatz der Spieler so gegen die KI gewinnt. Damit eine schnellere Simulation als in Realzeit funktioniert sind weitere Konzepte n\u00f6tig. Zum Beispiel die Entkoppelung des Rendering und der Spiellogik.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Diskussion<\/h2>\n\n\n\n<p>Wir haben das popul\u00e4re Design Pattern &#8220;Command&#8221; detailliert betrachtet. Neben dem Standardanwendungsbeispiel, Editor, haben wir das Pattern f\u00fcr die Architektur eines Sportgame angewendet. Zahlreiche Use-Cases k\u00f6nnen durch das Command Pattern abgebildet werden. F\u00fcr eine Wiederholung bildet das Command Pattern einen wichtigen Part, es muss jedoch mit dem Pattern Snapshot kombiniert werden. Auch Use-Cases wie die Analyse verschiedener KI Implementierung gegen zuvor aufgenommen Spielz\u00fcgen finden im Command Pattern eine wichtige Grundlage.  <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Referenzen<\/h2>\n\n\n\n<p>[1] Gamma, E., Helm, R., Johnson, R., Vlissides, J. M. (1994).\u00a0<em>Design Patterns: Elements of Reusable Object-Oriented Software<\/em>. Addison-Wesley Professional. ISBN: 0201633612<br>[2] Fowler, M. (1999).\u00a0<em>Refactoring: Improving the Design of Existing Code<\/em>. Boston, MA, USA: Addison-Wesley. ISBN: 0-201-48567-2<br>[3] <a rel=\"noreferrer noopener\" href=\"https:\/\/refactoring.guru\/design-patterns\/command\" target=\"_blank\">https:\/\/refactoring.guru\/design-patterns\/command<\/a><br>[4] <a href=\"https:\/\/refactoring.guru\/design-patterns\/memento\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/refactoring.guru\/design-patterns\/memento<\/a><br><\/p>",
        "protected": false
    },
    "excerpt": {
        "rendered": "<p>Wir diskutieren das popul\u00e4re Command Pattern anhand eines Handball Game als Anwendungsbeispiel.<\/p>",
        "protected": false
    },
    "author": 1,
    "featured_media": 0,
    "comment_status": "open",
    "ping_status": "open",
    "sticky": false,
    "template": "",
    "format": "standard",
    "meta": {
        "ocean_post_layout": "",
        "ocean_both_sidebars_style": "",
        "ocean_both_sidebars_content_width": 0,
        "ocean_both_sidebars_sidebars_width": 0,
        "ocean_sidebar": "0",
        "ocean_second_sidebar": "0",
        "ocean_disable_margins": "enable",
        "ocean_add_body_class": "",
        "ocean_shortcode_before_top_bar": "",
        "ocean_shortcode_after_top_bar": "",
        "ocean_shortcode_before_header": "",
        "ocean_shortcode_after_header": "",
        "ocean_has_shortcode": "",
        "ocean_shortcode_after_title": "",
        "ocean_shortcode_before_footer_widgets": "",
        "ocean_shortcode_after_footer_widgets": "",
        "ocean_shortcode_before_footer_bottom": "",
        "ocean_shortcode_after_footer_bottom": "",
        "ocean_display_top_bar": "default",
        "ocean_display_header": "default",
        "ocean_header_style": "",
        "ocean_center_header_left_menu": "0",
        "ocean_custom_header_template": "0",
        "ocean_custom_logo": 0,
        "ocean_custom_retina_logo": 0,
        "ocean_custom_logo_max_width": 0,
        "ocean_custom_logo_tablet_max_width": 0,
        "ocean_custom_logo_mobile_max_width": 0,
        "ocean_custom_logo_max_height": 0,
        "ocean_custom_logo_tablet_max_height": 0,
        "ocean_custom_logo_mobile_max_height": 0,
        "ocean_header_custom_menu": "0",
        "ocean_menu_typo_font_family": "0",
        "ocean_menu_typo_font_subset": "",
        "ocean_menu_typo_font_size": 0,
        "ocean_menu_typo_font_size_tablet": 0,
        "ocean_menu_typo_font_size_mobile": 0,
        "ocean_menu_typo_font_size_unit": "px",
        "ocean_menu_typo_font_weight": "",
        "ocean_menu_typo_font_weight_tablet": "",
        "ocean_menu_typo_font_weight_mobile": "",
        "ocean_menu_typo_transform": "",
        "ocean_menu_typo_transform_tablet": "",
        "ocean_menu_typo_transform_mobile": "",
        "ocean_menu_typo_line_height": 0,
        "ocean_menu_typo_line_height_tablet": 0,
        "ocean_menu_typo_line_height_mobile": 0,
        "ocean_menu_typo_line_height_unit": "",
        "ocean_menu_typo_spacing": 0,
        "ocean_menu_typo_spacing_tablet": 0,
        "ocean_menu_typo_spacing_mobile": 0,
        "ocean_menu_typo_spacing_unit": "",
        "ocean_menu_link_color": "",
        "ocean_menu_link_color_hover": "",
        "ocean_menu_link_color_active": "",
        "ocean_menu_link_background": "",
        "ocean_menu_link_hover_background": "",
        "ocean_menu_link_active_background": "",
        "ocean_menu_social_links_bg": "",
        "ocean_menu_social_hover_links_bg": "",
        "ocean_menu_social_links_color": "",
        "ocean_menu_social_hover_links_color": "",
        "ocean_disable_title": "default",
        "ocean_disable_heading": "default",
        "ocean_post_title": "",
        "ocean_post_subheading": "",
        "ocean_post_title_style": "",
        "ocean_post_title_background_color": "",
        "ocean_post_title_background": 0,
        "ocean_post_title_bg_image_position": "",
        "ocean_post_title_bg_image_attachment": "",
        "ocean_post_title_bg_image_repeat": "",
        "ocean_post_title_bg_image_size": "",
        "ocean_post_title_height": 0,
        "ocean_post_title_bg_overlay": 0.5,
        "ocean_post_title_bg_overlay_color": "",
        "ocean_disable_breadcrumbs": "default",
        "ocean_breadcrumbs_color": "",
        "ocean_breadcrumbs_separator_color": "",
        "ocean_breadcrumbs_links_color": "",
        "ocean_breadcrumbs_links_hover_color": "",
        "ocean_display_footer_widgets": "default",
        "ocean_display_footer_bottom": "default",
        "ocean_custom_footer_template": "0",
        "_jetpack_memberships_contains_paid_content": false,
        "ocean_post_oembed": "",
        "ocean_post_self_hosted_media": "",
        "ocean_post_video_embed": "",
        "ocean_link_format": "",
        "ocean_link_format_target": "self",
        "ocean_quote_format": "",
        "ocean_quote_format_link": "post",
        "ocean_gallery_link_images": "off",
        "ocean_gallery_id": [],
        "footnotes": ""
    },
    "categories": [
        9
    ],
    "tags": [
        23
    ],
    "class_list": [
        "post-116",
        "post",
        "type-post",
        "status-publish",
        "format-standard",
        "hentry",
        "category-software-entwicklung",
        "tag-entwurfsmuster",
        "entry"
    ],
    "yoast_head": "<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Das Command Pattern in Sport Games - Janus IT<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/janus.rs\/de\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Das Command Pattern in Sport Games - Janus IT\" \/>\n<meta property=\"og:description\" content=\"Wir diskutieren das popul\u00e4re Command Pattern anhand eines Handball Game als Anwendungsbeispiel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/janus.rs\/de\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/\" \/>\n<meta property=\"og:site_name\" content=\"Janus IT\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-03T13:18:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-18T14:13:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png\" \/>\n<meta name=\"author\" content=\"Tim Janus\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@DarthB86\" \/>\n<meta name=\"twitter:site\" content=\"@DarthB86\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tim Janus\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/\"},\"author\":{\"name\":\"Tim Janus\",\"@id\":\"https:\/\/janus.rs\/en\/#\/schema\/person\/a4844f3174ecb193eccd444867233aef\"},\"headline\":\"Das Command Pattern in Sport Games\",\"datePublished\":\"2022-06-03T13:18:00+00:00\",\"dateModified\":\"2022-07-18T14:13:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/\"},\"wordCount\":826,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/janus.rs\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png\",\"keywords\":[\"Entwurfsmuster\"],\"articleSection\":[\"Software Entwicklung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/\",\"url\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/\",\"name\":\"Das Command Pattern in Sport Games - Janus IT\",\"isPartOf\":{\"@id\":\"https:\/\/janus.rs\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png\",\"datePublished\":\"2022-06-03T13:18:00+00:00\",\"dateModified\":\"2022-07-18T14:13:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage\",\"url\":\"http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png\",\"contentUrl\":\"http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/janus.rs\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Das Command Pattern in Sport Games\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/janus.rs\/en\/#website\",\"url\":\"https:\/\/janus.rs\/en\/\",\"name\":\"Janus IT\",\"description\":\"Software Engineering\",\"publisher\":{\"@id\":\"https:\/\/janus.rs\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/janus.rs\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/janus.rs\/en\/#organization\",\"name\":\"Janus IT\",\"url\":\"https:\/\/janus.rs\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/janus.rs\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2023\/01\/logo_only_color_nobg.png?fit=900%2C900&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2023\/01\/logo_only_color_nobg.png?fit=900%2C900&ssl=1\",\"width\":900,\"height\":900,\"caption\":\"Janus IT\"},\"image\":{\"@id\":\"https:\/\/janus.rs\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/DarthB86\",\"https:\/\/www.linkedin.com\/in\/tim-janus-07523b13\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/janus.rs\/en\/#\/schema\/person\/a4844f3174ecb193eccd444867233aef\",\"name\":\"Tim Janus\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/janus.rs\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c10bd363a36d45bc7a93771d86419edde82a41a77360c739a3eded5b41592c20?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c10bd363a36d45bc7a93771d86419edde82a41a77360c739a3eded5b41592c20?s=96&d=mm&r=g\",\"caption\":\"Tim Janus\"},\"sameAs\":[\"http:\/\/s916043165.online.de\"],\"url\":\"https:\/\/janus.rs\/de\/author\/darthb86\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->",
    "yoast_head_json": {
        "title": "Das Command Pattern in Sport Games - Janus IT",
        "robots": {
            "index": "index",
            "follow": "follow",
            "max-snippet": "max-snippet:-1",
            "max-image-preview": "max-image-preview:large",
            "max-video-preview": "max-video-preview:-1"
        },
        "canonical": "https:\/\/janus.rs\/de\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/",
        "og_locale": "de_DE",
        "og_type": "article",
        "og_title": "Das Command Pattern in Sport Games - Janus IT",
        "og_description": "Wir diskutieren das popul\u00e4re Command Pattern anhand eines Handball Game als Anwendungsbeispiel.",
        "og_url": "https:\/\/janus.rs\/de\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/",
        "og_site_name": "Janus IT",
        "article_published_time": "2022-06-03T13:18:00+00:00",
        "article_modified_time": "2022-07-18T14:13:36+00:00",
        "og_image": [
            {
                "url": "http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png",
                "type": "",
                "width": "",
                "height": ""
            }
        ],
        "author": "Tim Janus",
        "twitter_card": "summary_large_image",
        "twitter_creator": "@DarthB86",
        "twitter_site": "@DarthB86",
        "twitter_misc": {
            "Verfasst von": "Tim Janus",
            "Gesch\u00e4tzte Lesezeit": "4\u00a0Minuten"
        },
        "schema": {
            "@context": "https:\/\/schema.org",
            "@graph": [
                {
                    "@type": "Article",
                    "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#article",
                    "isPartOf": {
                        "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/"
                    },
                    "author": {
                        "name": "Tim Janus",
                        "@id": "https:\/\/janus.rs\/en\/#\/schema\/person\/a4844f3174ecb193eccd444867233aef"
                    },
                    "headline": "Das Command Pattern in Sport Games",
                    "datePublished": "2022-06-03T13:18:00+00:00",
                    "dateModified": "2022-07-18T14:13:36+00:00",
                    "mainEntityOfPage": {
                        "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/"
                    },
                    "wordCount": 826,
                    "commentCount": 0,
                    "publisher": {
                        "@id": "https:\/\/janus.rs\/en\/#organization"
                    },
                    "image": {
                        "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage"
                    },
                    "thumbnailUrl": "http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png",
                    "keywords": [
                        "Entwurfsmuster"
                    ],
                    "articleSection": [
                        "Software Entwicklung"
                    ],
                    "inLanguage": "de",
                    "potentialAction": [
                        {
                            "@type": "CommentAction",
                            "name": "Comment",
                            "target": [
                                "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#respond"
                            ]
                        }
                    ]
                },
                {
                    "@type": "WebPage",
                    "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/",
                    "url": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/",
                    "name": "Das Command Pattern in Sport Games - Janus IT",
                    "isPartOf": {
                        "@id": "https:\/\/janus.rs\/en\/#website"
                    },
                    "primaryImageOfPage": {
                        "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage"
                    },
                    "image": {
                        "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage"
                    },
                    "thumbnailUrl": "http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png",
                    "datePublished": "2022-06-03T13:18:00+00:00",
                    "dateModified": "2022-07-18T14:13:36+00:00",
                    "breadcrumb": {
                        "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#breadcrumb"
                    },
                    "inLanguage": "de",
                    "potentialAction": [
                        {
                            "@type": "ReadAction",
                            "target": [
                                "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/"
                            ]
                        }
                    ]
                },
                {
                    "@type": "ImageObject",
                    "inLanguage": "de",
                    "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#primaryimage",
                    "url": "http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png",
                    "contentUrl": "http:\/\/s916043165.online.de\/wp-content\/uploads\/2022\/07\/command_pattern_diagram.png"
                },
                {
                    "@type": "BreadcrumbList",
                    "@id": "https:\/\/janus.rs\/en\/2022\/06\/das-command-pattern-am-beispiel-von-sport-games\/#breadcrumb",
                    "itemListElement": [
                        {
                            "@type": "ListItem",
                            "position": 1,
                            "name": "Home",
                            "item": "https:\/\/janus.rs\/"
                        },
                        {
                            "@type": "ListItem",
                            "position": 2,
                            "name": "Das Command Pattern in Sport Games"
                        }
                    ]
                },
                {
                    "@type": "WebSite",
                    "@id": "https:\/\/janus.rs\/en\/#website",
                    "url": "https:\/\/janus.rs\/en\/",
                    "name": "Janus IT",
                    "description": "Software Engineering",
                    "publisher": {
                        "@id": "https:\/\/janus.rs\/en\/#organization"
                    },
                    "potentialAction": [
                        {
                            "@type": "SearchAction",
                            "target": {
                                "@type": "EntryPoint",
                                "urlTemplate": "https:\/\/janus.rs\/en\/?s={search_term_string}"
                            },
                            "query-input": {
                                "@type": "PropertyValueSpecification",
                                "valueRequired": true,
                                "valueName": "search_term_string"
                            }
                        }
                    ],
                    "inLanguage": "de"
                },
                {
                    "@type": "Organization",
                    "@id": "https:\/\/janus.rs\/en\/#organization",
                    "name": "Janus IT",
                    "url": "https:\/\/janus.rs\/en\/",
                    "logo": {
                        "@type": "ImageObject",
                        "inLanguage": "de",
                        "@id": "https:\/\/janus.rs\/en\/#\/schema\/logo\/image\/",
                        "url": "https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2023\/01\/logo_only_color_nobg.png?fit=900%2C900&ssl=1",
                        "contentUrl": "https:\/\/i0.wp.com\/janus.rs\/wp-content\/uploads\/2023\/01\/logo_only_color_nobg.png?fit=900%2C900&ssl=1",
                        "width": 900,
                        "height": 900,
                        "caption": "Janus IT"
                    },
                    "image": {
                        "@id": "https:\/\/janus.rs\/en\/#\/schema\/logo\/image\/"
                    },
                    "sameAs": [
                        "https:\/\/x.com\/DarthB86",
                        "https:\/\/www.linkedin.com\/in\/tim-janus-07523b13\/"
                    ]
                },
                {
                    "@type": "Person",
                    "@id": "https:\/\/janus.rs\/en\/#\/schema\/person\/a4844f3174ecb193eccd444867233aef",
                    "name": "Tim Janus",
                    "image": {
                        "@type": "ImageObject",
                        "inLanguage": "de",
                        "@id": "https:\/\/janus.rs\/en\/#\/schema\/person\/image\/",
                        "url": "https:\/\/secure.gravatar.com\/avatar\/c10bd363a36d45bc7a93771d86419edde82a41a77360c739a3eded5b41592c20?s=96&d=mm&r=g",
                        "contentUrl": "https:\/\/secure.gravatar.com\/avatar\/c10bd363a36d45bc7a93771d86419edde82a41a77360c739a3eded5b41592c20?s=96&d=mm&r=g",
                        "caption": "Tim Janus"
                    },
                    "sameAs": [
                        "http:\/\/s916043165.online.de"
                    ],
                    "url": "https:\/\/janus.rs\/de\/author\/darthb86\/"
                }
            ]
        }
    },
    "jetpack_featured_media_url": "",
    "jetpack_sharing_enabled": true,
    "_links": {
        "self": [
            {
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/posts\/116",
                "targetHints": {
                    "allow": [
                        "GET"
                    ]
                }
            }
        ],
        "collection": [
            {
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/posts"
            }
        ],
        "about": [
            {
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/types\/post"
            }
        ],
        "author": [
            {
                "embeddable": true,
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/users\/1"
            }
        ],
        "replies": [
            {
                "embeddable": true,
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/comments?post=116"
            }
        ],
        "version-history": [
            {
                "count": 24,
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/posts\/116\/revisions"
            }
        ],
        "predecessor-version": [
            {
                "id": 1484,
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/posts\/116\/revisions\/1484"
            }
        ],
        "wp:attachment": [
            {
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/media?parent=116"
            }
        ],
        "wp:term": [
            {
                "taxonomy": "category",
                "embeddable": true,
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/categories?post=116"
            },
            {
                "taxonomy": "post_tag",
                "embeddable": true,
                "href": "https:\/\/janus.rs\/de\/wp-json\/wp\/v2\/tags?post=116"
            }
        ],
        "curies": [
            {
                "name": "wp",
                "href": "https:\/\/api.w.org\/{rel}",
                "templated": true
            }
        ]
    }
}