{"id":37711,"date":"2024-11-01T09:59:48","date_gmt":"2024-11-01T09:59:48","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=37711"},"modified":"2024-11-01T11:04:02","modified_gmt":"2024-11-01T11:04:02","slug":"wpf-development-spaghetti-code","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/37711\/","title":{"rendered":"WPF Development, Spaghetti Code"},"content":{"rendered":"<p><body><\/p>\n<p>\n        WPF (Windows Presentation Foundation) is a UI framework developed by Microsoft, and it is a powerful tool for desktop application development. However, WPF development is prone to spaghetti code. Spaghetti code refers to a complex code structure that is difficult to read and maintain, which can hinder development productivity and negatively affect code quality.\n    <\/p>\n<h2>What is spaghetti code?<\/h2>\n<p>\n        Spaghetti code refers to a program structure that is abnormally tangled. It usually means that the dependencies between various functions or methods are high, making it difficult to follow the flow of the code. This can lead to difficulties during debugging or when adding features, and ultimately diminish the team&#8217;s work efficiency. This issue is particularly pronounced in event-driven programming like WPF.\n    <\/p>\n<h3>Causes of spaghetti code<\/h3>\n<ul>\n<li><strong>Poor architectural choices:<\/strong> If you do not adhere to MVC (Model-View-Controller) or MVVM (Model-View-ViewModel) patterns, the components can get tangled with each other.<\/li>\n<li><strong>Inefficient state management:<\/strong> If the method of managing the UI state is inefficient, the code can become complex and dependencies arise.<\/li>\n<li><strong>Use of global state:<\/strong> Using global variables accessible throughout the application can lead to unexpected bugs.<\/li>\n<li><strong>Excessive event handling:<\/strong> Overusing events can increase the complexity of the code.<\/li>\n<\/ul>\n<h2>How to prevent spaghetti code in WPF<\/h2>\n<p>\n        To prevent spaghetti code, it is necessary to adhere to several principles. Proper application of these principles can enhance code readability and improve maintainability.\n    <\/p>\n<h3>1. Utilize the MVVM pattern<\/h3>\n<p>\n        The MVVM pattern is a particularly effective architectural design pattern in WPF. MVVM separates the application into three components: Model, View, and ViewModel, clarifying each role. This separation allows for easier maintenance by decoupling UI from business logic.\n    <\/p>\n<pre><code>\n        \/\/ Model\n        public class UserModel\n        {\n            public string Name { get; set; }\n            public int Age { get; set; }\n        }\n\n        \/\/ ViewModel\n        public class UserViewModel : INotifyPropertyChanged\n        {\n            private UserModel user;\n            public UserModel User\n            {\n                get { return user; }\n                set { user = value; OnPropertyChanged(nameof(User)); }\n            }\n\n            public event PropertyChangedEventHandler PropertyChanged;\n            protected void OnPropertyChanged(string propertyName) =&gt;\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n        }\n    <\/code><\/pre>\n<h3>2. Use Commands<\/h3>\n<p>\n        In WPF, you can define commands through the ICommand interface and relay events to the UI elements. This enhances code readability and aids in the separation of UI and logic.\n    <\/p>\n<pre><code>\n        public class RelayCommand : ICommand\n        {\n            private readonly Action<object> execute;\n            private readonly Predicate<object> canExecute;\n\n            public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)\n            {\n                this.execute = execute ?? throw new ArgumentNullException(nameof(execute));\n                this.canExecute = canExecute;\n            }\n\n            public event EventHandler CanExecuteChanged\n            {\n                add { CommandManager.RequerySuggested += value; }\n                remove { CommandManager.RequerySuggested -= value; }\n            }\n\n            public bool CanExecute(object parameter) =&gt; canExecute == null || canExecute(parameter);\n            public void Execute(object parameter) =&gt; execute(parameter);\n        }\n    <\/code><\/pre>\n<h3>3. Data Binding<\/h3>\n<p>\n        Data binding is one of the most powerful features of WPF. You should leverage binding to ensure smooth data flow between View and ViewModel. This reduces dependencies between UI code and business logic, maintaining code consistency.\n    <\/p>\n<pre><code>\n        \/\/ XAML\n        <textbox text=\"{Binding User.Name, UpdateSourceTrigger=PropertyChanged}\"><\/textbox>\n    <\/code><\/pre>\n<h3>4. Organized project structure<\/h3>\n<p>\n        Clearly defining the project structure and segregating components by functionality can enhance maintainability. For instance, using folders like Models, ViewModels, and Views organizes files according to their roles. Such an approach makes code navigation and maintenance easier.\n    <\/p>\n<h3>5. Code reviews and refactoring<\/h3>\n<p>\n        Regular code reviews and refactoring are another important way to prevent spaghetti code. Through code reviews, team members can exchange feedback and promptly address discovered issues. Refactoring helps tidy up code, reduce duplication, and improve readability.\n    <\/p>\n<h2>Example of spaghetti code<\/h2>\n<p>\n        The code below is a simple example that illustrates how a spaghetti code structure can manifest in WPF. Here, a simple function to input and save user information is implemented, but the functionalities are too intertwined, making maintenance difficult.\n    <\/p>\n<pre><code>\n        public partial class MainWindow : Window\n        {\n            public MainWindow()\n            {\n                InitializeComponent();\n            }\n\n            private void SaveUser()\n            {\n                var name = txtName.Text;\n                var age = int.Parse(txtAge.Text);\n                \/\/ In-memory database save logic here...\n                MessageBox.Show(\"User saved.\");\n            }\n\n            private void btnSave_Click(object sender, RoutedEventArgs e)\n            {\n                SaveUser();\n            }\n        }\n    <\/code><\/pre>\n<p>\n        The above code mixes the user information input UI and business logic within a single class. This reduces the independence of each functionality and can complicate changes or feature additions.\n    <\/p>\n<h2>Conclusion<\/h2>\n<p>\n        Spaghetti code is something to avoid in WPF development. Proper architectural patterns, use of commands, data binding, an organized project structure, and code reviews and refactoring greatly help prevent spaghetti code and enhance code quality. Adhering to and implementing these principles can significantly improve the quality of WPF applications. It is always important to keep the code clean.\n    <\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"<p>WPF (Windows Presentation Foundation) is a UI framework developed by Microsoft, and it is a powerful tool for desktop application development. However, WPF development is prone to spaghetti code. Spaghetti code refers to a complex code structure that is difficult to read and maintain, which can hinder development productivity and negatively affect code quality. What &hellip; <a href=\"https:\/\/atmokpo.com\/w\/37711\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;WPF Development, Spaghetti Code&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[117],"tags":[],"class_list":["post-37711","post","type-post","status-publish","format-standard","hentry","category-wpf-programming"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WPF Development, Spaghetti Code - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/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:\/\/atmokpo.com\/w\/37711\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WPF Development, Spaghetti Code - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"WPF (Windows Presentation Foundation) is a UI framework developed by Microsoft, and it is a powerful tool for desktop application development. However, WPF development is prone to spaghetti code. Spaghetti code refers to a complex code structure that is difficult to read and maintain, which can hinder development productivity and negatively affect code quality. What &hellip; \ub354 \ubcf4\uae30 &quot;WPF Development, Spaghetti Code&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/37711\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T09:59:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:04:02+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"4\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/37711\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37711\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"WPF Development, Spaghetti Code\",\"datePublished\":\"2024-11-01T09:59:48+00:00\",\"dateModified\":\"2024-11-01T11:04:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37711\/\"},\"wordCount\":556,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"WPF Programming\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/37711\/\",\"url\":\"https:\/\/atmokpo.com\/w\/37711\/\",\"name\":\"WPF Development, Spaghetti Code - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T09:59:48+00:00\",\"dateModified\":\"2024-11-01T11:04:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37711\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/37711\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/37711\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WPF Development, Spaghetti Code\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WPF Development, Spaghetti Code - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","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:\/\/atmokpo.com\/w\/37711\/","og_locale":"ko_KR","og_type":"article","og_title":"WPF Development, Spaghetti Code - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"WPF (Windows Presentation Foundation) is a UI framework developed by Microsoft, and it is a powerful tool for desktop application development. However, WPF development is prone to spaghetti code. Spaghetti code refers to a complex code structure that is difficult to read and maintain, which can hinder development productivity and negatively affect code quality. What &hellip; \ub354 \ubcf4\uae30 \"WPF Development, Spaghetti Code\"","og_url":"https:\/\/atmokpo.com\/w\/37711\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T09:59:48+00:00","article_modified_time":"2024-11-01T11:04:02+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"4\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/37711\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/37711\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"WPF Development, Spaghetti Code","datePublished":"2024-11-01T09:59:48+00:00","dateModified":"2024-11-01T11:04:02+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/37711\/"},"wordCount":556,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["WPF Programming"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/37711\/","url":"https:\/\/atmokpo.com\/w\/37711\/","name":"WPF Development, Spaghetti Code - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T09:59:48+00:00","dateModified":"2024-11-01T11:04:02+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/37711\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/37711\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/37711\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"WPF Development, Spaghetti Code"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37711","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=37711"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37711\/revisions"}],"predecessor-version":[{"id":37712,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37711\/revisions\/37712"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=37711"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=37711"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=37711"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}