CINXE.COM
Improving the Design of Existing Software | PPT | Free Download
<!DOCTYPE html><html lang="en"><script id="gtm"> performance.mark('gtm.start'); (function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; j.onload = function () { performance.mark('gtm.end'); performance.measure('gtm', 'gtm.start', 'gtm.end'); }; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-M36RG8PT'); </script><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><link rel="shortcut icon" href="https://public.slidesharecdn.com/_next/static/media/favicon.7bc3d920.ico"/><script> window.eventsToSend = window.eventsToSend || [] window.eventsToSend.push({ name: "page_rendering", timestamp: new Date().toISOString(), value: JSON.stringify({ time: performance?.now() }) }) </script><script type="speculationrules">{"prerender":[{"where":{"and":[{"href_matches":"/slideshow/*"}]},"eagerness":"moderate"}]}</script><title>Improving the Design of Existing Software | PPT | Free Download</title><meta name="robots" content="index, follow"/><meta name="title" content="Improving the Design of Existing Software"/><meta name="description" content="Improving the Design of Existing Software - Download as a PDF or view online for free"/><link rel="canonical" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420"/><link rel="alternate" hrefLang="en" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420"/><link rel="alternate" hrefLang="x-default" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420"/><link rel="preconnect" href="https://a.pub.network/" crossorigin="anonymous"/><link rel="preconnect" href="https://b.pub.network/" crossorigin="anonymous"/><link rel="preconnect" href="https://c.pub.network/" crossorigin="anonymous"/><link rel="preconnect" href="https://d.pub.network/" crossorigin="anonymous"/><link rel="preconnect" href="https://c.amazon-adsystem.com" crossorigin="anonymous"/><link rel="preconnect" href="https://s.amazon-adsystem.com" crossorigin="anonymous"/><link rel="preconnect" href="https://secure.quantserve.com/" crossorigin="anonymous"/><link rel="preconnect" href="https://rules.quantcount.com/" crossorigin="anonymous"/><link rel="preconnect" href="https://pixel.quantserve.com/" crossorigin="anonymous"/><link rel="preconnect" href="https://btloader.com/" crossorigin="anonymous"/><link rel="preconnect" href="https://api.btloader.com/" crossorigin="anonymous"/><link rel="preconnect" href="https://confiant-integrations.global.ssl.fastly.net" crossorigin="anonymous"/><link rel="preload" href="https://a.pub.network/slideshare-net/pubfig.min.js" as="script"/><script> window.freestarReactCompontentLoaded = true; // Prevents Freestar from appending the script a second time; typo is theirs window.freestar = window.freestar || { queue: [] }; window.freestar.config = freestar.config || {}; window.freestar.config.disabledProducts = { googleInterstitial: false, }; window.eventsToSend = window.eventsToSend || []; window.freestar.queue.push(function () { window.eventsToSend.push({ name: "freestar_queue_start", timestamp: new Date().toISOString() }) }); </script><meta name="twitter:site" content="@SlideShare"/><meta name="twitter:card" content="player"/><meta name="twitter:title" content="Improving the Design of Existing Software"/><meta name="twitter:description" content="Improving the Design of Existing Software - Download as a PDF or view online for free"/><meta name="twitter:image" content="https://cdn.slidesharecdn.com/ss_thumbnails/improvingthedesignofexistingsoftware-171026145936-thumbnail.jpg?width=640&height=640&fit=bounds"/><meta name="twitter:image:alt" content="Improving the Design of Existing Software"/><meta name="twitter:player" content="https://www.slideshare.net/slideshow/embed_code/key/3FzNAJNnFsIa1v"/><meta name="twitter:player:width" content="597"/><meta name="twitter:player:height" content="486"/><meta name="twitter:app:name:googleplay" content="SlideShare Android"/><meta name="twitter:app:id:googleplay" content="net.slideshare.mobile"/><meta name="twitter:app:name:iphone" content="SlideShare iOS"/><meta name="twitter:app:id:iphone" content="917418728"/><meta name="twitter:app:url:iphone" content="slideshare-app://ss/165952101"/><meta name="twitter:app:name:ipad" content="SlideShare iOS"/><meta name="twitter:app:id:ipad" content="917418728"/><meta name="twitter:app:url:ipad" content="slideshare-app://ss/165952101"/><meta property="og:site_name" content="SlideShare"/><meta property="og:type" content="website"/><meta property="og:url" content="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420"/><meta property="og:title" content="Improving the Design of Existing Software"/><meta property="og:description" content="Improving the Design of Existing Software - Download as a PDF or view online for free"/><meta property="og:image" content="https://cdn.slidesharecdn.com/ss_thumbnails/improvingthedesignofexistingsoftware-171026145936-thumbnail.jpg?width=640&height=640&fit=bounds"/><meta property="og:image:alt" content="Improving the Design of Existing Software"/><meta property="og:image:type" content="image/webp"/><meta property="og:image:width" content="640"/><meta property="og:image:height" content="360"/><script type="application/ld+json">{"@context":"http://schema.org","@type":"CreativeWork","name":"Improving the Design of Existing Software","description":"The document discusses improving the design of existing software by following principles like DRY, SOLID, and refactoring code using techniques such as extracting classes, methods, and interfaces. It emphasizes writing characterization tests to preserve existing behavior when refactoring, and improving code quality by reducing duplication, dependencies, and complexity over time through preventative maintenance and refactoring.","url":"https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420","datePublished":"2017-10-26 14:59:36 UTC","publisher":{"@type":"Organization","name":"Slideshare","url":"https://www.slideshare.net/"},"encodingFormat":"application/pdf","fileFormat":"pdf","inLanguage":"en","mainEntityOfPage":{"@type":"WebPage","@id":"https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420"}}</script><script type="application/ld+json">{"@context":"https://schema.org/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.slideshare.net"},{"@type":"ListItem","position":2,"name":"Technology","item":"https://www.slideshare.net/category/technology"},{"@type":"ListItem","position":3,"name":"Improving the Design of Existing Software","item":"https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420"}]}</script><script> freestar.queue.push(function() { googletag.pubads().setTargeting('test', []); }); </script><meta name="next-head-count" content="56"/><link rel="preload" href="https://public.slidesharecdn.com/_next/static/media/9c20d643cc03e499-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="https://public.slidesharecdn.com/_next/static/media/a9b61b60c2d733b4-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><noscript data-n-css=""></noscript><link rel="preload" href="https://cmp.osano.com/AzZdHGSGtpxCq1Cpt/079b27eb-bb3f-48dd-9bd9-3feb8aec3c38/osano.js" as="script"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/webpack-fca657b2df1193b1.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/framework-0dfcca9a5dec51b3.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/main-4b9e5138f827276f.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/pages/_app-29d59c5f3fe3a369.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/5121-c12bfd4bed7c2139.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/5581-c31338dd77890eb2.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/4740-639dc16ecd764905.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/6229-23a3a93a4fd8bda9.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/chunks/pages/slideshow/%5Btitle%5D/%5Bid%5D-451dcf877ad69f2b.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/c2d26bae6c4ddd627835d4a0b06e445f4baa0ea6/_buildManifest.js"/><link rel="preload" as="script" href="https://public.slidesharecdn.com/_next/static/c2d26bae6c4ddd627835d4a0b06e445f4baa0ea6/_ssgManifest.js"/><style>:root{--black:#000;--white:#fff;--alice-blue-100:#f5fcff;--alice-blue-200:#f2faff;--alice-blue-600:#ddf1f9;--celadon-blue:#027eb0;--celadon-blue-dark:#026c97;--midnight-green-dark:#002e3c;--light-gray:#e9edf8;--pale-gray:#fdfdfd;--snow-gray:#f3f6fd;--snow-gray-100:#f9faff;--blue-gray-100:#f5f6fa;--blue-gray-200:#e3e6f0;--blue-gray-300:#d0d6e6;--blue-gray-400:#b4bbd1;--blue-gray-500:#989fbc;--blue-gray-600:#636c8b;--blue-gray-700:#424766;--blue-gray-800:#212240;--blue-gray-900:#0e0f25;--blue-300:#005e93;--blue-200:#0076b9;--blue-100:#e7f5fc;--gray-500:#303133;--tangerine-100:#fbedd8;--color-info:#3aa7ea;--color-error:#bf3131;--color-success:#337c41;--color-warning:#cd5308;--color-error-red-100:#f2dede;--celadon-blue-rgb:2,126,176;--blue-gray-600-rgb:99,108,139;--color-twitter:#1da1f2;--color-twitter-hover:#1a91da;--color-facebook:#3b5998;--color-facebook-hover:#3c5586;--color-linkedin:#337ab1;--color-linkedin-hover:#2e6e9f;--color-scribd:#1e7b85;--color-scribd-hover:#1d7680;--color-sms:#3b3835;--color-email:#bbc4c8;color-scheme:only light;--header-height:64px;--toolbar-height:54px;--progress-bar-height:8px;--pushdown-height:90px;--adhesion-height:0px;--key-moments-size:140px;--sidebar-size:404px;--metadata-toolbar-height:100px;--metadata-toolbar-offset:0px;--metadata-toolbar-shadow-opacity:0;--actions-menu-height:74px;--max-content-width:1688px;--border-radius:8px;--sticky-index:8;--header-index:11;--dropdown-index:99;--freestar-index:999;--progress-bar-index:9999;--popup-index:9999;--toast-index:99999;--pointly-index:2;--slide-actions-index:3;--font-weight-light:300;--font-weight-regular:400;--font-weight-medium:600;--font-weight-bold:700;--font-weight-black:900;--font-size-large:16px;--font-size-medium:14px;--font-size-small:12px;--font-size-xsmall:10px;--line-height-relax:1.5;--line-height-compact:1.15;--line-height-tight:1;--ease:cubic-bezier(0.2,0,0,1)}@media screen and (max-width:1249px){:root{--sidebar-size:364px}}@media screen and (max-width:1024px){:root{--header-height:75px}}@media screen and (max-width:767px){:root{--pushdown-height:50px}}@media only screen and (min-width:929px){:root{--actions-menu-height:0}}*,:after,:before{box-sizing:border-box}*{margin:0}:focus-visible{outline:2px solid rgba(2,126,176,.7);outline-offset:2px}body,html{min-height:100%}html{scroll-behavior:smooth;scrollbar-gutter:stable}body{background-color:var(--white);font-family:var(--font-family);font-size:var(--font-size-medium);line-height:var(--line-height-relax);overflow:clip scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}canvas,img,picture,video{display:block;max-width:100%}button,input,select,textarea{font-family:var(--font-family)}h1,h2,h3,h4,h5,h6,p{overflow-wrap:break-word}#__next,#root{isolation:isolate;min-height:100%;height:-moz-max-content;height:max-content}::-moz-selection{color:var(--blue-gray-900);background-color:var(--blue-gray-200)}::selection{color:var(--blue-gray-900);background-color:var(--blue-gray-200)}body:has(dialog[open]){overflow:clip}header:has(+aside.visible){box-shadow:none}header:has(+aside:not(.visible)){box-shadow:0 1px 0 0 var(--blue-gray-200)}.content-wrapper{width:100%;max-width:var(--max-content-width);margin-inline:auto}.clamp-lines{-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;display:-webkit-box}.clamp-lines,.ellipsis{text-overflow:ellipsis;overflow:hidden}.ellipsis{white-space:nowrap}.seo-only,.sr-only{position:absolute!important;width:1px;height:1px;border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);padding:0;margin:-1px;overflow:hidden;white-space:nowrap}.no-scroll,body[class^=no-scroll-for-]{overflow:hidden;touch-action:none}.hide-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.hide-scrollbar::-webkit-scrollbar{display:none}.unstyled-button{background:none;border:none;padding:0}body:has(#slideshare_pushdown-pushdown-cls iframe){--pushdown-height:90px}body:has(.fs-pushdown-sticky:empty){--pushdown-height:0px}@media only screen and (max-width:928px){#fs-sticky-footer{bottom:var(--actions-menu-height)}}@media only screen and (min-width:1051px){body:has(#slideshare_pushdown-pushdown-cls.fs-pushdown-sticky){--metadata-toolbar-offset:0px!important}}.metadata-toolbar{top:var(--metadata-toolbar-offset)}body:has(#fs-sticky-footer iframe) #fixed-download-container{bottom:var(--adhesion-height,0)}body:not(:has(#fs-sticky-footer iframe)) #fs-sticky-footer{min-height:0!important}dialog[open]{display:grid;opacity:1}dialog[open]::backdrop{opacity:.6}dialog{width:auto;height:auto;max-width:100dvw;max-height:100dvh;box-shadow:0 0 0 1px rgba(9,30,66,.08),0 2px 1px rgba(9,30,66,.08),0 0 20px -6px rgba(9,30,66,.3);border:0;padding:0;overflow:clip}dialog,dialog::backdrop{opacity:0;transition:opacity .3s ease-out,transform .3s ease-out,translate .3s ease-out,display allow-discrete .3s,overlay allow-discrete .3s}dialog::backdrop{background-color:#000}@starting-style{dialog[open],dialog[open]::backdrop{opacity:0}}.popover.open,[popover]:popover-open{opacity:1;scale:1}[popover]:popover-open::backdrop{opacity:0}.popover{display:none;z-index:var(--popup-index)}.popover.open{display:block;opacity:1}.popover,[popover]{position:absolute;inset:auto;color:var(--blue-gray-800);background-color:canvas;border:0;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.05),0 4px 12px rgba(0,0,0,.2);overscroll-behavior:contain;overflow:clip auto;padding:0;margin-block:1ch;scale:.96}.popover,[popover],[popover]::backdrop{transition:opacity .3s,scale .3s,display allow-discrete .2s,overlay allow-discrete .2s;opacity:0}@starting-style{.popover.open,[popover]:popover-open,[popover]:popover-open::backdrop{opacity:0}.popover.open,[popover]:popover-open{scale:.96}}.popover [data-popover-list],[popover] [data-popover-list]{display:flex;flex-direction:column;list-style:none;padding-inline:0;padding-block:8px}.popover [data-popover-item],[popover] [data-popover-item]{width:100%;display:flex;align-items:center;gap:8px;padding-block:12px;padding-inline:16px;color:inherit;text-decoration:none}.popover [data-popover-item]:hover,[popover] [data-popover-item]:hover{background-color:var(--blue-gray-100)}.popover [role=separator],[popover] [role=separator]{margin-block:8px;margin-inline:16px}@supports (anchor-name:--foo-bar){[popover]{position-try-order:most-height;position-visibility:anchors-visible}[popover][data-popover-position=bottom]{top:anchor(bottom);left:anchor(center);translate:-50% 0;transform-origin:top center;position-try:flip-block}[popover][data-popover-position=bottom-start]{top:anchor(bottom);left:anchor(start);transform-origin:top left;position-try:flip-block,flip-inline}[popover][data-popover-position=bottom-end]{top:anchor(bottom);right:anchor(end);transform-origin:top right;position-try:flip-block,flip-inline}[popover][data-popover-position=top]{bottom:anchor(top);left:anchor(center);transform-origin:bottom center;position-try:flip-block}[popover][data-popover-position=top-start]{bottom:anchor(top);left:anchor(start);transform-origin:bottom left;position-try:flip-block,flip-inline}[popover][data-popover-position=top-end]{bottom:anchor(top);right:anchor(end);transform-origin:bottom right;position-try:flip-block,flip-inline}}#fs-sticky-footer,.orp-player-wrapper{z-index:var(--freestar-index)!important}.fs-sticky-parent{position:static!important}.fs-sticky-wrapper{padding-right:0!important;display:block!important}#slideshare_pushdown-pushdown-cls.fs-pushdown-sticky{position:static!important}body.no-scroll-mobile #slideshare_pushdown-pushdown-cls{height:auto}body.gallery-view #slideshare_pushdown-pushdown-cls{display:none}#pushdown-ad-large{display:grid;justify-content:center;align-items:center}#above-recs-desktop-ad-sm,#above-recs-mobile,#below-reader-ad,#between-recs-ad-1,#between-recs-ad-2{height:280px}@media screen and (min-width:929px){#below-reader-ad,#between-recs-ad-1,#between-recs-ad-2{height:250px}#above-recs-desktop-ad-sm,#above-recs-desktop-ad-sm-2{aspect-ratio:336/280;height:280px;margin-bottom:32px}#above-recs-desktop-ad-sm_container{justify-content:left!important}}@media only screen and (min-width:1051px){body{--padding-x-offset:clamp(1rem,-1.6rem + 8vw,8rem);--margin-x-offset:0px;--end:calc(var(--padding-x-offset) + var(--sidebar-size) + var(--margin-x-offset))}#fs-sticky-footer:has(#slideshare_adhesion){left:0;width:calc(100% - var(--end))}#fs-sticky-footer:has(#slideshare_adhesion2){width:var(--end);left:unset;right:0}}@media only screen and (min-width:1689px){body{--margin-x-offset:calc(calc(100% - var(--max-content-width)) / 2)}}div:has(>#between-recs-ad-1),div:has(>#between-recs-ad-2),div:has(>#interstitial-ad-1),div:has(>[id^=slideshare_docs_incontent]){display:grid;justify-content:center}div:has(>#interstitial-ad-1.video-interstitial-ad){display:block}@media screen and (max-width:928px){div:has(>#above-recs-mobile),div:has(>#below-reader-ad){display:grid;justify-content:center}}#fs-sticky-footer.hidden,.orp-player-wrapper.hidden{display:none!important}@media only screen and (max-width:928px){#fs-sticky-footer.hidden-on-mobile,.orp-player-wrapper.hidden-on-mobile{display:none!important}}div[id^=FreeStarVideoAdContainer_]{width:100%}#freestar-video-child:not(:empty){margin-bottom:24px}div[id^=FreeStarVideoAdContainer_FloatingOnly]{width:auto;aspect-ratio:auto}:root{--shadow-color:rgba(122,61,143,.15);--osano-dialog-shadow:drop-shadow(var(--shadow-color) 0.5px 1px 1px) drop-shadow(var(--shadow-color) 1px 2px 2px) drop-shadow(var(--shadow-color) 2px 4px 4px) drop-shadow(var(--shadow-color) 4px 8px 8px) drop-shadow(var(--shadow-color) 8px 16px 16px)}.osano-cm-dialog{background-color:#212240;color:var(--white)}.osano-cm-dialog__close{color:inherit;stroke:var(--white)}.osano-cm-dialog--eu{display:grid;grid-template-columns:1fr 200px;grid-column-gap:48px;-moz-column-gap:48px;column-gap:48px;max-height:95dvh;font-family:Source Sans Pro,sans-serif;color:var(--blue-gray-600,#636c8b);background-color:var(--white,#fff);border-top-left-radius:var(--border-radius,8px);border-top-right-radius:var(--border-radius,8px);filter:var(--osano-dialog-shadow);padding-block-start:32px;padding-block-end:20px;padding-inline:5%;.osano-cm-dialog__content{max-height:calc(95dvh - 52px)}.osano-cm-dialog__close{display:none}.osano-cm-dialog__title{font-size:24px;font-weight:700;color:var(--blue-gray-900,#0e0f25);margin-block-end:16px}.osano-cm-content__usage-list{font-size:16px}.osano-cm-usage-list__list{margin-block-start:8px;margin-block-end:16px;margin-inline-start:8px;.osano-cm-list__list-item{font-size:16px}}.osano-cm-link,.osano-cm-message{font-size:16px}.osano-cm-message{display:flex}.osano-cm-drawer-links,.osano-cm-link{display:inline}.osano-cm-link{color:var(--celadon-blue,#027eb0);font-weight:600;text-decoration:none;&:hover{color:var(--celadon-blue-dark,#026c97)}&:after{content:"|";padding-inline:12px}&:last-child:after{content:""}}.osano-cm-dialog__list{line-height:normal;margin-block-start:24px;.osano-cm-list__list-item{display:inline-flex;align-items:center;&:after{content:"|";padding-inline:16px;color:var(--blue-gray-200,#e3e6f0);font-size:28px}&:last-child:after{content:""}}}.osano-cm-toggle__switch{display:none}.osano-cm-toggle__input{width:16px;height:16px;margin:unset;overflow:unset;accent-color:var(--blue-gray-900,#0e0f25);position:static;opacity:1}.osano-cm-toggle__label.osano-cm-label{color:var(--blue-gray-600,#636c8b);font-size:18px;font-weight:600;margin-left:8px;margin-inline-end:0}.osano-cm-dialog__buttons{min-width:unset;align-self:flex-end;display:grid;grid-row-gap:8px;row-gap:8px;justify-content:stretch;align-items:center;margin:unset;.osano-cm-buttons__button{height:-moz-max-content;height:max-content;min-height:40px;font-size:16px;font-weight:600;margin:unset}.osano-cm-accept-all{order:-1}.osano-cm-accept-all,.osano-cm-manage{background-color:var(--celadon-blue,#027eb0)}.osano-cm-deny,.osano-cm-denyAll,.osano-cm-save{background-color:transparent;color:var(--celadon-blue,#027eb0);border:1px solid var(--celadon-blue,#027eb0)}}}.osano-cm-dialog--eu.osano-cm-dialog--br{.osano-cm-dialog__title{font-size:26px;font-weight:600}.osano-cm-dialog__buttons{row-gap:12px}}.osano-cm-window:has(>.osano-cm-dialog--br-overlay):before{content:"";position:fixed;inset:0;background-color:rgba(0,0,0,.6);z-index:-1}@media screen and (max-width:768px){.osano-cm-dialog--eu{-moz-column-gap:24px;column-gap:24px;grid-template-columns:1fr;padding-block-end:32px;padding-inline:16px;.osano-cm-dialog__buttons{display:flex;flex-wrap:nowrap;align-items:center;justify-content:flex-start;gap:16px;.osano-cm-buttons__button{width:-moz-max-content;width:max-content}}}.osano-cm-dialog--eu.osano-cm-dialog--br{.osano-cm-link,.osano-cm-message{font-size:16px;width:auto}.osano-cm-dialog__buttons{margin-block-start:24px;row-gap:16px}}}@media screen and (max-width:520px){.osano-cm-dialog--eu{font-size:14px;padding-block-start:16px;padding-block-end:16px;.osano-cm-dialog__title{font-size:20px;margin-block-end:8px}.osano-cm-link,.osano-cm-message{font-size:inherit}.osano-cm-usage-list__list{font-size:12px;.osano-cm-list__list-item{font-size:inherit}}.osano-cm-toggle__label.osano-cm-label{font-size:15px}.osano-cm-dialog__list{width:100%;display:flex;flex-direction:column;margin-block-start:8px;.osano-cm-list__list-item{display:grid;border-bottom:1px solid var(--blue-gray-200,#e3e6f0);padding-block:4px;&:last-child{border-bottom:unset}}.osano-cm-list__list-item:after{content:unset}.osano-cm-list-item__toggle{align-self:baseline;justify-content:space-between;.osano-cm-toggle__label{order:-1;margin:unset}}}.osano-cm-dialog__buttons{display:grid;grid-template-columns:1fr 1fr;grid-column-gap:16px;-moz-column-gap:16px;column-gap:16px;grid-row-gap:12px;row-gap:12px;margin-block-start:0;.osano-cm-buttons__button{min-width:-moz-max-content;min-width:max-content;width:unset;justify-self:stretch}.osano-cm-accept-all{grid-column:1/span 2}}}.osano-cm-dialog--eu.osano-cm-dialog--br{padding-block-start:32px;padding-block-end:32px;.osano-cm-dialog__title{font-size:26px;margin-block-end:16px}.osano-cm-link,.osano-cm-message{font-size:16px;width:auto}.osano-cm-dialog__buttons{margin-block-start:24px;row-gap:16px}}}@media screen and (min-width:929px){.osano-cm-widget{display:none}.osano-cm-content__message{margin-bottom:8px;padding-bottom:0;width:90%}.osano-cm-message{font-size:12px}.osano-cm-drawer-links{margin:0}.osano-cm-link{color:var(--celadon-blue);font-size:12px}.osano-cm-list__list-item{font-size:12px}.osano-cm-dialog__buttons{display:flex;align-items:center;gap:6px}.osano-cm-button{height:44px;font-size:14px;background-color:var(--celadon-blue);border-color:var(--celadon-blue);color:var(--white);padding:10px;margin:3px 0}.osano-cm-denyAll{background-color:var(--blue-gray-800);border-color:var(--white);color:var(--white)}}.osano-cm-widget{display:none}.osano-cm-content__message{margin-bottom:8px;padding-bottom:0;width:90%}.osano-cm-message{font-size:12px}.osano-cm-drawer-links{margin:0}.osano-cm-link{color:var(--celadon-blue);font-size:12px}.osano-cm-list__list-item{font-size:12px}.osano-cm-dialog__buttons{display:flex;align-items:center;gap:6px}.osano-cm-button{height:44px;font-size:14px;background-color:var(--celadon-blue);border-color:var(--celadon-blue);color:var(--white);padding:10px;margin:3px 0}.osano-cm-denyAll{background-color:var(--blue-gray-800);border-color:var(--white);color:var(--white)}@font-face{font-family:__Source_Sans_3_4d9a39;font-style:normal;font-weight:200 900;font-display:swap;src:url(https://public.slidesharecdn.com/_next/static/media/bccb245ee3362e85-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:__Source_Sans_3_4d9a39;font-style:normal;font-weight:200 900;font-display:swap;src:url(https://public.slidesharecdn.com/_next/static/media/4117e16a89310b23-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:__Source_Sans_3_4d9a39;font-style:normal;font-weight:200 900;font-display:swap;src:url(https://public.slidesharecdn.com/_next/static/media/2a041df68de43fa6-s.woff2) format("woff2");unicode-range:u+1f??}@font-face{font-family:__Source_Sans_3_4d9a39;font-style:normal;font-weight:200 900;font-display:swap;src:url(https://public.slidesharecdn.com/_next/static/media/17c5807503b61094-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:__Source_Sans_3_4d9a39;font-style:normal;font-weight:200 900;font-display:swap;src:url(https://public.slidesharecdn.com/_next/static/media/7572a3f8628c1f19-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:__Source_Sans_3_4d9a39;font-style:normal;font-weight:200 900;font-display:swap;src:url(https://public.slidesharecdn.com/_next/static/media/9c20d643cc03e499-s.p.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:__Source_Sans_3_4d9a39;font-style:normal;font-weight:200 900;font-display:swap;src:url(https://public.slidesharecdn.com/_next/static/media/a9b61b60c2d733b4-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:__Source_Sans_3_Fallback_4d9a39;src:local("Arial");ascent-override:109.21%;descent-override:42.66%;line-gap-override:0.00%;size-adjust:93.76%}.__className_4d9a39{font-family:__Source_Sans_3_4d9a39,__Source_Sans_3_Fallback_4d9a39,Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-style:normal}.__variable_4d9a39{--font-family:"__Source_Sans_3_4d9a39","__Source_Sans_3_Fallback_4d9a39",Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.PageProgressBar_root__1y_Q3{position:fixed;top:0;left:0;width:100%;z-index:var(--progress-bar-index);pointer-events:none}.PageProgressBar_bar__Kyoem{width:100%;height:3px;background-color:var(--celadon-blue);transform:scaleX(0);transform-origin:left;transition:transform .4s cubic-bezier(.4,0,.2,1),opacity .5s ease;opacity:1}.PageProgressBar_complete__KhJy3{opacity:0}.ErrorShell_root__zYUH8{min-height:100vh;display:flex;flex-direction:column}.Header_root__8A86O{--fluid-16-24:clamp(1rem,0.7373rem + 1.3136vi,1.5rem);position:relative;height:var(--header-height);display:grid;grid-template-columns:auto 1fr;align-items:center;grid-gap:24px;gap:24px;background-color:var(--white);font-family:inherit;padding-inline:var(--fluid-16-24)}.Header_root__8A86O.Header_sticky__NGNE7{position:sticky;top:0;transition:box-shadow .3s ease-in-out;z-index:var(--header-index)}.Header_root__8A86O button{font-size:14px;white-space:nowrap}.Header_wrapper___zBfP{display:flex;align-items:center;flex-shrink:0;gap:12px}@media screen and (min-width:768px){.Header_root__8A86O{grid-template-columns:repeat(3,minmax(min-content,1fr))}}.Hamburger_root__tHlgC{display:grid;place-content:center;background:transparent;border:0;border-radius:2px;color:var(--blue-gray-600);padding:0;margin:0;cursor:pointer}@media screen and (min-width:768px){.Hamburger_root__tHlgC{display:none}}.SidebarFallback_loggedOutRoot__oKMfe{display:grid;grid-template-rows:170px 1fr}.SidebarFallback_loggedOutContainer__Tpr_u{display:flex;flex-direction:column;padding:16px}.SidebarFallback_loggedInRoot__r1CEd{display:grid;grid-template-rows:64px 1fr}.SidebarFallback_loggedInContainer__dw_ML{display:flex;flex-direction:column;gap:16px;padding:16px}.SidebarFallback_loggedInLinks__C2NaL{display:grid;grid-gap:24px;gap:24px}.SidebarFallback_loggedInUser__b8i41{display:flex;align-items:center;gap:8px;margin-block-start:12px;margin-block-end:auto}.Skeleton_root__U4QqL{--skeleton-bg:rgba(0,0,0,.1);--shimmer-bg:linear-gradient(90deg,transparent,rgba(0,0,0,.04),transparent);position:relative;display:block;height:1.2rem;flex-shrink:0;background:var(--skeleton-bg);overflow:hidden}.Skeleton_root__U4QqL:after{content:"";position:absolute;inset:0;translate:-100% 0;background:var(--shimmer-bg);animation:Skeleton_shimmer__hGst9 2s ease-in-out .5s infinite}.Skeleton_circle___fxTG{aspect-ratio:1/1;border-radius:100vmax;height:unset}.Skeleton_rectangle__UY3OD{border-radius:0}.Skeleton_rounded__BLBq2{border-radius:4px}.Skeleton_text___JusF{border-radius:4px;font-size:1rem;scale:1 .6}.Skeleton_text___JusF:before{content:"\00a0"}.Skeleton_list__xNehW{display:flex;flex-direction:column;gap:6px;padding-inline:8px;padding-block:10px}.Skeleton_copy__qgw2R{display:flex;flex-direction:column;padding-block:12px;padding-inline:16px}.Skeleton_copy__qgw2R .skeleton:first-child{margin-block-end:8px}@keyframes Skeleton_shimmer__hGst9{0%{translate:-100% 0}50%{translate:100% 0}to{translate:100% 0}}.Icon_root__AjZyv{--size:24px;position:relative;display:flex;align-items:center;justify-content:center}.Icon_icon__4zzsG{flex-shrink:0;display:inline-block;width:var(--size);height:var(--size);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:cover;mask-size:cover;vertical-align:middle}.Drawer_root__ob4ZM[open]{translate:0 0}.Drawer_root__ob4ZM{position:fixed;inset:0;border-radius:0;translate:var(--slide-from)}@starting-style{.Drawer_root__ob4ZM[open]{translate:var(--slide-from)}}.Drawer_root__ob4ZM[data-placement=left]{--slide-from:-100% 0;inset-inline-end:auto;border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius)}.Drawer_root__ob4ZM[data-placement=right]{--slide-from:100% 0;inset-inline-start:unset;border-top-left-radius:var(--border-radius);border-bottom-left-radius:var(--border-radius)}.Drawer_root__ob4ZM[data-placement=bottom]{--slide-from:0 100%;inset-block-start:unset;border-top-left-radius:var(--border-radius);border-top-right-radius:var(--border-radius)}.Drawer_content__ye6ZB{display:grid;overflow:auto}.Drawer_root__ob4ZM[data-placement=left],.Drawer_root__ob4ZM[data-placement=right]{width:min(280px,80vw);height:100dvh}.Drawer_root__ob4ZM[data-placement=bottom]{width:100dvw;max-height:80dvh}.CloseButton_root__JCTRm{position:absolute;right:16px;top:16px;width:40px;height:40px;display:grid;place-content:center;color:var(--blue-gray-600);border-radius:100vmax;background-color:transparent;border:0;padding:0;margin:0;transition:background-color .2s ease-in-out;cursor:pointer}.CloseButton_root__JCTRm:hover{background-color:rgba(var(--blue-gray-600-rgb),.05)}.Logo_root__Qba3h{flex-shrink:0}.SearchForm_root__usp4s{position:relative;justify-self:center;width:min(100%,440px)}.SearchForm_root__usp4s form{display:grid}.SearchForm_root__usp4s input{height:40px;border-radius:100vmax;border:1px solid var(--blue-gray-600);margin:0;padding:0 40px 0 16px;color:var(--blue-gray-900);background-color:var(--white);width:100%}.SearchForm_root__usp4s input::-moz-placeholder{color:var(--blue-gray-600)}.SearchForm_root__usp4s input::placeholder{color:var(--blue-gray-600)}.SearchForm_submit__U8kPR{width:32px;height:32px;position:absolute;right:14px;top:50%;display:grid;place-content:center;border:none;background:transparent;border-radius:100vmax;color:var(--blue-gray-400);padding:0;margin:0;translate:0 -50%;cursor:pointer}@media screen and (max-width:768px){.SearchForm_root__usp4s{justify-self:flex-end}}.HeaderActions_root__11_ai{display:flex;align-items:center;justify-self:flex-end;gap:16px}@media screen and (max-width:768px){.HeaderActions_root__11_ai{display:none}}.Footer_footer__N3WmV{width:100%;display:flex;flex-direction:column;background-color:var(--midnight-green-dark);color:var(--blue-gray-400);padding:24px;margin-top:auto}.Footer_separator__Qa1tj{border:1px solid var(--white);opacity:.2;margin:24px 0}.FooterTop_wrapper__RuYz5{display:flex;justify-content:space-between;align-items:center;gap:24px}.FooterTop_links__9J65v{color:inherit;display:flex;align-items:center;flex-wrap:wrap;-moz-column-gap:40px;column-gap:40px;row-gap:12px;padding:0;margin:0}.FooterTop_cookiePreferenceButton__xmSox{background-color:transparent;border:none;color:inherit;font-size:inherit;font-weight:800;cursor:pointer}@media screen and (max-width:768px){.FooterTop_links__9J65v{-moz-column-gap:24px;column-gap:24px}}.Link_root__vn3ab{display:inline-flex;align-items:center;gap:4px;border-radius:2px;color:inherit;font-size:inherit;font-weight:inherit;text-decoration:none;-webkit-text-decoration-color:transparent;text-decoration-color:transparent;transition:color .2s ease-in-out,-webkit-text-decoration-color .2s ease-in-out .2s;transition:color .2s ease-in-out,text-decoration-color .2s ease-in-out .2s;transition:color .2s ease-in-out,text-decoration-color .2s ease-in-out .2s,-webkit-text-decoration-color .2s ease-in-out .2s}.Link_primary__Iq4CI{color:var(--celadon-blue-dark)}.Link_primary__Iq4CI:focus,.Link_primary__Iq4CI:focus-visible,.Link_primary__Iq4CI:hover{color:var(--celadon-blue)}.Link_gray__Efpxa{color:var(--blue-gray-600)}.Link_gray__Efpxa:focus,.Link_gray__Efpxa:focus-visible,.Link_gray__Efpxa:hover{color:var(--blue-gray-700)}.Link_light__mcUPh{color:var(--blue-gray-400)}.Link_light__mcUPh:focus,.Link_light__mcUPh:focus-visible,.Link_light__mcUPh:hover{color:var(--blue-gray-100)}.Link_dark__Ql4LW{color:var(--blue-gray-800)}.Link_dark__Ql4LW:focus,.Link_dark__Ql4LW:focus-visible,.Link_dark__Ql4LW:hover{color:var(--celadon-blue)}.Link_weight-regular__yPpnB{font-weight:400}.Link_weight-medium__h0ic3{font-weight:600}.Link_weight-bold__me4nt{font-weight:700}.Link_size-small__wSSrC{font-size:12px}.Link_size-medium__ZLo12{font-size:14px}.Link_size-large__W0PAv{font-size:16px}.Link_size-xLarge__Dq0j8{font-size:18px}.Link_hoverUnderline__QMNau:hover,.Link_underline__RoQbh{text-decoration:underline;-webkit-text-decoration-color:inherit;text-decoration-color:inherit}.Link_hoverUnderline__QMNau:hover{text-decoration-thickness:1.5px;text-underline-offset:2px}.FooterBottom_wrapper__Gj9p_{height:51px;display:flex;align-items:center;gap:24px}.FooterBottom_copyright__xltkG{font-size:14px;line-height:24px;margin-right:auto}.FooterBottom_icons__wEEhc{display:flex;align-items:center;gap:16px}.FooterBottom_separator__181dN{width:2px;height:22px;background-color:var(--white);opacity:.2}.PrivateContentMessage_root__IEx17{flex-grow:1;width:100%;height:100%;display:flex;align-items:flex-start}.PrivateContentMessage_box__YG0Bp{width:100%;max-width:960px;background-color:#f2dede;border-color:#eed3d7;border-radius:8px;color:#b94a48;font-size:14px;font-weight:400;padding:16px 24px;margin:100px auto}@media screen and (max-width:960px){.PrivateContentMessage_box__YG0Bp{margin-left:16px;margin-right:16px}}.RemovedContentMessage_root__rtN5X{flex-grow:1;width:100%;display:flex;align-items:flex-start}.RemovedContentMessage_box__pw1z3{width:100%;max-width:960px;background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px;color:#c09853;font-size:14px;font-weight:400;text-shadow:0 1px 0 hsla(0,0%,100%,.5);padding:16px 24px;margin:100px auto}.RemovedContentMessage_title__vwHjN{color:#504c48;font-size:25px;font-weight:300;line-height:35px;margin-bottom:4px}@media screen and (max-width:960px){.RemovedContentMessage_box__pw1z3{margin-left:16px;margin-right:16px}}.ErrorDisplay_root__bY_Qo{height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--white);font-family:-system-ui,sans-serif;color:var(--blue-gray-800)}.ErrorDisplay_smiley__o9HSN{width:129px;height:122px;margin:60px auto 30px}.ErrorDisplay_errorBox__jL_9h{max-width:800px;width:100%;height:290px;background:var(--white) url(/images/fadedlogo.jpg) no-repeat left top;background-position:14px 20px;margin:0 auto 120px}.ErrorDisplay_errorCode__AlZal{border-right:1px solid var(--blue-gray-100);color:var(--blue-gray-500);float:left;font-size:1.3em;height:290px;line-height:370px;margin:0 25px 0 0;vertical-align:bottom;text-align:center;width:200px}.ErrorDisplay_errorBox__jL_9h h1{font-weight:400;margin-bottom:0}.ErrorDisplay_errorBox__jL_9h h2{font-size:.9em;font-weight:400;margin-top:0}.ErrorDisplay_errorBox__jL_9h h3{font-size:1em;font-weight:700;margin:10px 0}.ErrorDisplay_errorBox__jL_9h ul{list-style-type:none}.ErrorDisplay_errorBox__jL_9h ul li{background:transparent url(/images/arrow.png) no-repeat left 6px;float:left;font-size:.813em;font-weight:400;list-style-type:none;margin:.313em;padding-left:20px;width:110px}.ErrorDisplay_middle__espDJ{padding-right:3.5em}.ErrorDisplay_searchSection__1J_EK{background:var(--blue-gray-100) url(/images/searchbg.jpg) repeat-x left top;border:1px solid var(--blue-gray-300);float:left;padding:10px;margin-top:20px}.ErrorDisplay_searchSection__1J_EK form{display:flex}.ErrorDisplay_searchSection__1J_EK button{background:url(/images/searchbutton.jpg) repeat-x scroll 0 0 #ffb762;border:1px solid #db9b51;color:var(--blue-gray-800);cursor:pointer;float:left;font-size:1em;margin:0 0 0 .8px;padding:9px 15px;outline:0 none;text-decoration:none;text-shadow:1px 1px 1px var(--white);vertical-align:top}.ErrorDisplay_searchSection__1J_EK button span{background:#ffb762 url(/images/magnifier.jpg) no-repeat 0 0;padding:0 8px;margin-left:5px;text-decoration:none}.ErrorDisplay_errorSearchBox__Uglib{border-color:var(--blue-gray-500) var(--blue-gray-400) var(--blue-gray-400) var(--blue-gray-500);border-width:1px;color:var(--blue-gray-600);float:left;font-size:13px;margin-left:2px;padding:9px;vertical-align:top;width:350px}@media screen and (max-width:768px){.ErrorDisplay_searchSection__1J_EK{width:calc(100% - 240px)}.ErrorDisplay_errorSearchBox__Uglib{width:calc(100% - 128px);margin:0 auto}}.ToastManager_root__mVUMQ{position:fixed;inset-block-end:0;inset-inline:0;display:grid;justify-items:flex-end;justify-content:flex-end;grid-gap:1vh;gap:1vh;padding-block-end:5vh;padding-right:1rem;pointer-events:none;z-index:var(--toast-index)}@media only screen and (max-width:928px){.ToastManager_root__mVUMQ{justify-items:center;justify-content:center;padding-right:0;top:0;padding-block-start:2vh;inset-block-end:unset}}.Toast_root__ZhPa4{min-width:360px;max-width:360px;display:grid;grid-template-columns:max-content 1fr repeat(2,max-content);grid-gap:4px;gap:4px;background-color:var(--background);border-radius:8px;color:var(--white);padding-block:28px;padding-inline:24px;pointer-events:all;opacity:1;transition:opacity .3s ease-in-out}@starting-style{.Toast_root__ZhPa4{opacity:0}}.Toast_info__g9NV8{--background:var(--midnight-green-dark)}.Toast_success__sWJ1E{--background:var(--color-success)}.Toast_error__SQpXK{--background:var(--color-error)}.Toast_warning__7GyxY{--background:var(--color-warning)}.Toast_root__ZhPa4>svg{flex-shrink:0;margin-top:2px}.Toast_content__whMkq{font-weight:400;font-size:16px;line-height:24px;word-wrap:break-word}.Toast_separator__dUZVN{width:1px;background-color:var(--blue-gray-500);opacity:.3;margin-inline:8px}.Toast_dismiss___YbdO{color:var(--blue-gray-300);cursor:pointer}.Toast_dismiss___YbdO:hover{color:var(--white)}.PortalsContainer_drawerRoot__esMLC{position:fixed;top:0;left:0}.PortalsContainer_bannerRoot__Q_sNw{position:relative}.PortalsContainer_drawerRoot__esMLC{z-index:101} /*# sourceMappingURL=72ab5910a3b55ae9.css.map*/</style><style>.SlideshowScreen_root__k9j1_{width:100%;max-width:var(--max-content-width);position:relative;display:grid;place-content:flex-start;grid-template-columns:minmax(0,1fr) var(--sidebar-size);grid-template-rows:auto auto 1fr;background-color:var(--white);padding-block:1px;padding-inline:clamp(1rem,-1.6rem + 8vw,8rem);margin-inline:auto}.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe{grid-template-columns:var(--key-moments-size) minmax(0,1fr) var(--sidebar-size)}.SlideshowScreen_root__k9j1_.SlideshowScreen_withAdSidebar__iVE05{--sidebar-size:calc(1px + 300px + 56px)}.SlideshowScreen_root__k9j1_:before{content:"";position:absolute;inset:0 0 auto;height:1px;background-color:var(--blue-gray-200);margin-inline:-50vw}.SlideshowScreen_root__k9j1_ .sidebar{border-left:1px solid var(--blue-gray-200);grid-row:1/-1;grid-column:2}.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe .sidebar{grid-column:3}.SlideshowScreen_root__k9j1_ .metadata{grid-column:1/-2;grid-row:1}.SlideshowScreen_root__k9j1_ .metadata-toolbar{grid-column:1/-2;grid-row:2}.SlideshowScreen_root__k9j1_ .player{grid-column:1}@media screen and (min-width:929px){.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe .player{grid-column:2;grid-row:3}}.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe .key-moments{grid-column:1;grid-row:3}@media screen and (min-width:929px){.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe .player{border-left:1px solid var(--blue-gray-200)}.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe .metadata{padding-inline-end:24px}}@media screen and (min-width:929px) and (max-width:1050px){.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe{grid-template-columns:var(--key-moments-size) minmax(0,1fr);padding-inline:0}.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe .metadata,.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe .metadata-toolbar{grid-column:1/-1;padding-inline:16px}}@media screen and (max-width:928px){.SlideshowScreen_root__k9j1_:before{display:none}.SlideshowScreen_root__k9j1_.SlideshowScreen_withKeyMoments__RbHLe{grid-template-columns:minmax(0,1fr)!important}.SlideshowScreen_root__k9j1_ .metadata,.SlideshowScreen_root__k9j1_ .metadata-toolbar,.SlideshowScreen_root__k9j1_ .player{grid-column:1/-1}}.PrivateContentScreen_root__qdfD9{gap:30px}.PasswordForm_root__Pnyoo,.PrivateContentScreen_root__qdfD9{min-height:calc(100svh - 2 * var(--header-height));background-color:var(--blue-gray-100);display:flex;flex-direction:column;align-items:center;justify-content:center}.PasswordForm_root__Pnyoo{gap:20px}.Form_root__NTbyO{display:flex;flex-direction:column;gap:10px}.Form_root__NTbyO button[type=submit]{align-self:flex-start}.Button_root__i1yp0{--size:44px;--foreground:var(--white);--background:var(--celadon-blue);--border:var(--celadon-blue);--fontSize:16px;--padding-x:14px;position:relative;min-width:48px;min-height:var(--size);display:flex;align-items:center;border-radius:4px;border:none;background-color:var(--background);color:var(--foreground);font-size:var(--fontSize);font-weight:var(--font-weight-medium);padding-inline:var(--padding-x);transition:color .2s ease-in-out,background-color .2s ease-in-out;cursor:pointer}.Button_root__i1yp0 span{display:flex;align-items:center;gap:4px;opacity:1;transition:opacity .2s ease-in-out}.Button_large__Yv_oe{--fontSize:18px;--size:48px;--padding-x:20px}.Button_regular__i28NX{--fontSize:18px;--size:44px}.Button_medium__H8pKi{--size:40px}.Button_small__sqsEx{--size:32px;--padding-x:12px}.Button_xsmall__jBPCG{--fontSize:14px;--size:24px;--padding-x:8px}.Button_root__i1yp0.Button_icon__1C4qi{justify-content:center;min-width:24px;padding:0}.Button_icon__1C4qi{width:var(--size);height:var(--size)}.Button_spinner__iLPXf{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility .2s ease-in-out}.Button_loading__ZYqeE .Button_spinner__iLPXf{opacity:1;visibility:visible;transition-delay:0s}.Button_loading__ZYqeE span{opacity:0}.Button_fullWidth__dRbM6{width:100%;justify-content:center}.Button_fullWidth__dRbM6 span{justify-content:center}.Button_disabled__M5jJf{opacity:.8;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.Button_primary__K25Gq.Button_contained__gyjai{--foreground:var(--white);--background:var(--celadon-blue);--border:var(--celadon-blue)}.Button_primary__K25Gq.Button_contained__gyjai:active,.Button_primary__K25Gq.Button_contained__gyjai:hover{--background:var(--celadon-blue-dark);--border:var(--celadon-blue-dark)}.Button_primary__K25Gq.Button_outlined__oZHqK{border:1px solid var(--border);--foreground:var(--celadon-blue-dark);--background:transparent;--border:var(--celadon-blue-dark)}.Button_primary__K25Gq.Button_outlined__oZHqK:hover{--foreground:var(--blue-gray-800);--background:rgba(var(--celadon-blue-rgb),0.05);--border:var(--blue-gray-800)}.Button_primary__K25Gq.Button_outlined__oZHqK:active{--foreground:var(--celadon-blue-dark);--background:rgba(var(--celadon-blue-rgb),0.1);--border:var(--celadon-blue)}.Button_primary__K25Gq.Button_text__ZT_3O{--foreground:var(--celadon-blue-dark);--background:transparent;--border:transparent}.Button_primary__K25Gq.Button_text__ZT_3O:hover{--foreground:var(--celadon-blue-dark);--background:rgba(var(--celadon-blue-rgb),0.05);--border:transparent}.Button_primary__K25Gq.Button_text__ZT_3O:active{--foreground:var(--celadon-blue);--background:rgba(var(--celadon-blue-rgb),0.1);--border:transparent}.Button_secondary__hHiHI.Button_contained__gyjai{--foreground:var(--white);--background:var(--blue-gray-600);--border:var(--blue-gray-600)}.Button_secondary__hHiHI.Button_contained__gyjai:hover{--background:var(--blue-gray-700);--border:var(--blue-gray-700)}.Button_secondary__hHiHI.Button_contained__gyjai:active{--background:var(--blue-gray-500);--border:var(--blue-gray-500)}.Button_secondary__hHiHI.Button_outlined__oZHqK{border:1px solid var(--border);--foreground:var(--blue-gray-600);--background:transparent;--border:var(--blue-gray-600)}.Button_secondary__hHiHI.Button_outlined__oZHqK:hover{--foreground:var(--blue-gray-700);--background:rgba(var(--blue-gray-600-rgb),0.05);--border:var(--blue-gray-700)}.Button_secondary__hHiHI.Button_outlined__oZHqK:active{--foreground:var(--blue-gray-600);--background:rgba(var(--blue-gray-600-rgb),0.1);--border:var(--blue-gray-500)}.Button_secondary__hHiHI.Button_regular__i28NX{border:1px solid var(--border);--foreground:var(--blue-gray-700);--background:var(--white);--border:var(--blue-gray-200)}.Button_secondary__hHiHI.Button_regular__i28NX:hover{--background:var(--blue-gray-100)}.Button_secondary__hHiHI.Button_text__ZT_3O{--foreground:var(--blue-gray-600);--background:transparent;--border:transparent}.Button_secondary__hHiHI.Button_text__ZT_3O:hover{--foreground:var(--blue-gray-700);--background:rgba(var(--blue-gray-600-rgb),0.05);--border:transparent}.Button_secondary__hHiHI.Button_text__ZT_3O:active{--foreground:var(--blue-gray-600);--background:rgba(var(--blue-gray-600-rgb),0.1);--border:transparent}.Button_tertiary__ae6C5{--foreground:var(--blue-gray-700);--background:var(--white);border:1px solid var(--blue-gray-200)}.Button_tertiary__ae6C5:hover{--background:var(--blue-gray-100)}.Button_tertiary__ae6C5.Button_active__YNf7E,.Button_tertiary__ae6C5:active{--background:var(--blue-gray-200)}.Dropdown_container__NBOZ_{display:flex;flex-direction:column;gap:8px;font-family:var(--font-family);width:100%;max-width:280px}.Dropdown_select__8pQOA{border:1px solid var(--blue-gray-500);border-radius:4px;font-size:16px;font-weight:400;color:var(--blue-gray-900);margin:0;padding:8px 20px 8px 8px;background:transparent}.Dropdown_select__8pQOA:hover{border:1px solid var(--blue-gray-600);background:transparent}.Dropdown_select__8pQOA:focus{outline:none;border:1px solid var(--celadon-blue)}.Dropdown_footerText__NChWz{color:var(--blue-gray-600);font-size:11px;font-weight:400}.Dropdown_error__QI4FY{border:1px solid var(--color-error)}.Label_label__KH246{font-weight:600;font-size:14px;font-family:var(--font-family);color:var(--blue-gray-600);margin:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.Label_error__jqh1I{color:var(--color-error)}.RequiredNotice_required___q_RJ{display:flex;align-items:center;gap:8px;color:var(--blue-gray-600);font-size:11px;font-weight:400}.RequiredNotice_error__eBy3b{color:var(--color-error)}.Input_container__QSkRF{display:flex;flex-direction:column;gap:8px;font-family:var(--font-family);width:100%;max-width:280px}.Input_input__Q0qP2{padding:8px;border:1px solid var(--blue-gray-500);border-radius:4px;font-size:16px;font-weight:400;color:var(--blue-gray-900);margin:0;height:46px}.Input_input__Q0qP2:hover{border:1px solid var(--blue-gray-600)}.Input_input__Q0qP2:focus{outline:none;border:1px solid var(--celadon-blue)}.Input_error__l9OaT{border:1px solid var(--color-error)}.Input_characterLimit__4NkYE{color:var(--blue-gray-600);font-size:11px;font-weight:400}.Input_characterLimitError__ZByP3{color:var(--color-error)}.Input_footer__55AdV{display:flex;justify-content:space-between}.Input_footerAlignRight__DG8UZ{justify-content:flex-end}.Text_root__is73U{display:inline-block;padding:0;margin:0}.Text_primary__rZf7F{color:var(--blue-gray-900)}.Text_secondary__EPWj0{color:var(--blue-gray-600)}.Text_success__Mcw5I{color:var(--color-success)}.Text_error__pdEO6{color:var(--color-error)}.Text_warning__xCiZk{color:var(--color-warning)}.Text_white__Sb1IU{color:#fff}.Text_rowTitle__U1gB1{font-size:28px;line-height:35px}.Text_xlarge__X3NtK{font-size:20px;line-height:26px}.Text_large__c_Tar{font-size:18px;line-height:26px}.Text_medium__rk8Tn{font-size:16px;line-height:22px}.Text_small__S0zKm{font-size:14px;line-height:18px}.Text_xsmall__vYp9p{font-size:12px;line-height:15px}.Text_xxsmall__kOJdm{font-size:11px;line-height:14px}.Text_disabled___vAZA{color:var(--blue-gray-500)}.Text_italic__ZZFbJ{font-style:italic}.Text_weight-light__Rh8tc{font-weight:300}.Text_weight-regular__gWC16{font-weight:400}.Text_weight-medium__oIdYz{font-weight:500}.Text_weight-strong__yEO2S{font-weight:600}.Text_weight-bold__xnsIS{font-weight:700}.Text_ellipsis__QNjvO{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Text_lineClamp__SO_Pl{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical}.TextArea_container__oc_q4{display:flex;flex-direction:column;gap:8px;font-family:var(--font-family);width:100%;max-width:280px}.TextArea_textarea__VyrNQ{padding:8px;border:1px solid var(--blue-gray-500);border-radius:4px;font-size:16px;font-weight:400;color:var(--blue-gray-900);font-family:var(--font-family);min-height:150px;margin:0}.TextArea_textarea__VyrNQ:hover{border:1px solid var(--blue-gray-600)}.TextArea_textarea__VyrNQ:focus{outline:none;border:1px solid var(--celadon-blue);background:transparent}.TextArea_error__o_XpL{border:1px solid var(--color-error)}.TextArea_characterLimit__hm9El{color:var(--blue-gray-600);font-size:11px;font-weight:400}.TextArea_characterLimitError__UbPM9{color:var(--color-error)}.TextArea_footer__EG4wA{display:flex;justify-content:space-between}.TextArea_footerAlignRight__PmO7Z{justify-content:flex-end}.TagInput_container__4lPGD{display:flex;flex-direction:column;gap:8px;font-family:var(--font-family);width:100%;max-width:280px}.TagInput_input__lsGqa{border:none;flex:1 1;min-width:100px;height:30px}.TagInput_tag__9BE6f{border-radius:20px;padding:4px 8px;border:1px solid var(--blue-gray-300);display:flex;gap:8px;font-size:14px;color:var(--blue-gray-600);font-weight:600;align-items:center}.TagInput_closeTag__oeDgn{border:none;background-color:transparent;padding:0;color:var(--blue-gray-500);font-size:10px;margin:0}.TagInput_closeTag__oeDgn:hover{opacity:.75;cursor:pointer}.TagInput_inputContainer__dl2dW{box-sizing:border-box;padding:8px;border:1px solid var(--blue-gray-500);border-radius:4px;font-size:16px;font-weight:400;color:var(--blue-gray-900);width:100%;display:flex;gap:8px}.TagInput_inputContainer__dl2dW:hover{border:1px solid var(--blue-gray-600)}.TagInput_input__lsGqa:focus{outline:none;border-radius:4px;border:1px solid var(--celadon-blue)}.TagInput_error__INAMJ{border:1px solid var(--color-error)}.TagInput_errorText__Dq2QW{display:flex;align-items:center;gap:8px;color:var(--color-error);font-size:11px;font-weight:400}.TagInput_autocompleteContainer__RgOvw{position:relative}.TagInput_autocomplete__nGD9D{background-color:var(--white);display:flex;flex-direction:column;width:100%;position:absolute;left:0;right:0;top:-8px;box-shadow:0 .5px 5px rgba(0,0,0,.039),0 3.75px 11px rgba(0,0,0,.19);border-radius:4px;overflow-y:scroll;z-index:3}.TagInput_suggestion__k4kfh{padding:8px;color:var(--blue-gray-600);font-weight:600;text-decoration:underline;text-underline-offset:1.5px}.TagInput_suggestion__k4kfh:hover{cursor:pointer;color:var(--blue-gray-600)}.TagInput_focusedSuggestion__QnSXo,.TagInput_suggestion__k4kfh:hover{background-color:var(--blue-gray-200)}.TagInput_tagContainer__LflB5{display:flex;gap:8px;flex-wrap:wrap;width:100%}.TagInput_footerText__O_1t4{color:var(--blue-gray-600);font-size:11px;font-weight:400}.Selector_container__v2jVr{display:flex;flex-direction:column;gap:8px;font-family:var(--font-family);width:100%;max-width:280px}.Selector_selector__U2foh{border-radius:4px;display:flex;width:100%}.Selector_selector__U2foh button{border:1px solid var(--blue-gray-500);padding:6px 0;flex:1 1;margin:0;background-color:transparent}.Selector_selector__U2foh button:enabled:hover{cursor:pointer;background-color:var(--blue-gray-300)}.Selector_selector__U2foh button:first-child{border-radius:4px 0 0 4px}.Selector_selector__U2foh button:last-child{border-radius:0 4px 4px 0}.Selector_selector__U2foh button.Selector_selected__nyxjH{border:1px solid var(--celadon-blue);background-color:var(--celadon-blue)}.Selector_selector__U2foh button.Selector_selected__nyxjH .Selector_text__Rs7F7{color:var(--white)}.Selector_selector__U2foh button.Selector_selected__nyxjH:focus{outline-offset:4px}.Selector_selectorContainer__h4Mg1{display:flex;align-items:center;gap:4px}.Selector_icon__Y9S90{color:var(--blue-gray-500)}.Selector_text__Rs7F7{margin:0;font-weight:400;font-size:16px;font-family:Source Sans Pro,sans-serif}.IconWithExplanation_container__21T3S{position:relative;display:inline-flex}.IconWithExplanation_explanation___qwbw{position:absolute;top:50%;transform:translateY(-50%);left:120%;background-color:#fff;border-radius:4px;box-shadow:0 .5px 5px rgba(0,0,0,.039),0 3.75px 11px rgba(0,0,0,.19);z-index:3;padding:8px;width:150px}.IconWithExplanation_container__21T3S:hover .IconWithExplanation_explanation___qwbw{display:block}.IconWithExplanation_arrow__fCL_Y{content:"";position:absolute;left:-10px;margin-left:-5px;top:50%;transform:translateY(-50%);border:10px solid transparent;border-right-color:#fff}@media (max-width:768px){.IconWithExplanation_arrow__fCL_Y{margin-right:-5px;margin-left:0;border-color:transparent transparent transparent #fff;left:auto;right:-10px}.IconWithExplanation_explanation___qwbw{left:auto;right:120%}}.Checkbox_wrapper__HI5JR{display:flex;gap:10px;align-items:center}.Checkbox_input__RZSBL:hover,.Checkbox_label__7BF2Y:hover,.Checkbox_wrapper__HI5JR:hover{cursor:pointer}.Checkbox_wrapper__HI5JR .Checkbox_label__7BF2Y{font-weight:400;color:var(--blue-gray-900);margin:0}.Checkbox_wrapper__HI5JR .Checkbox_input__RZSBL{width:20px;height:20px;accent-color:var(--celadon-blue);margin:0}.Checkbox_wrapper__HI5JR:hover .Checkbox_input__RZSBL{accent-color:var(--celadon-blue-dark)}.Checkbox_wrapper__HI5JR:hover .Checkbox_label__7BF2Y{color:var(--celadon-blue-dark)}.RadioButton_root__592m2{--size:16px;--borderSize:2px;display:inline-flex;align-items:center;justify-content:flex-start;gap:12px;padding-block:8px;cursor:pointer}.RadioButton_root__592m2.RadioButton_large__K_9NI{--size:24px}.RadioButton_root__592m2.RadioButton_rtl__rAcql{font-size:16px;justify-content:space-between}.RadioButton_root__592m2:hover:not(.RadioButton_labelOnLeft__nb96s){font-weight:600}.RadioButton_root__592m2 input[type=radio]{position:relative;width:var(--size);height:var(--size);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;margin:0;border:var(--borderSize) solid var(--blue-gray-500);border-radius:100vmax}.RadioButton_root__592m2 input[type=radio]:before{content:"";position:absolute;top:50%;left:50%;display:block;width:calc(var(--size) / 2);height:calc(var(--size) / 2);background-color:var(--celadon-blue);border-radius:100vmax;translate:-50% -50%;transition:scale .2s;scale:0}.RadioButton_root__592m2.RadioButton_checked__dJL5R input[type=radio]{border-color:var(--celadon-blue)}.RadioButton_root__592m2.RadioButton_checked__dJL5R input[type=radio]:before{scale:1}.Banner_root__pOnAN{--background:var(--celadon-blue-dark);width:100vw;height:40px;display:flex;align-items:center;justify-content:center;background-color:var(--background);color:var(--white);font-size:var(--font-size-medium);font-weight:var(--font-weight-medium);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility .2s ease-in-out;z-index:1}.Banner_visible__q1NMx{opacity:1;visibility:visible;transition-delay:0s}.Banner_aboveHeader__hC_i_{position:static;top:0}.Banner_belowHeader__Mcfew{position:absolute;top:var(--header-height)}.Banner_info__7SXSI{--background:var(--color-info)}.Banner_success__wveEs{--background:var(--color-success)}.Banner_error__lW5NB{--background:var(--color-error)}.Banner_warning__pEEt7{--background:var(--color-warning)}.Metadata_root__oCstk{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));place-content:flex-start;padding-inline-end:20px;padding-block-start:32px}.Metadata_root__oCstk .author{grid-column:1;grid-row:3;align-content:flex-start}.Metadata_root__oCstk .description,.Metadata_root__oCstk .pills-list,.Metadata_root__oCstk .stats,.Metadata_root__oCstk .title{grid-column:1/span 2}.Metadata_root__oCstk .title{margin-bottom:8px}.Metadata_root__oCstk .stats{margin-bottom:12px}.Metadata_root__oCstk .description{margin-top:12px}.Metadata_root__oCstk .pills-list{margin-block-start:20px;margin-block-end:18px}.Metadata_root__oCstk .actions{display:none}@media screen and (max-width:928px){.Metadata_root__oCstk{margin-block:8px 20px}.Metadata_root__oCstk .stats{margin-bottom:16px}.Metadata_root__oCstk .description{margin-top:0}.Metadata_root__oCstk .author{grid-column:2;grid-row:5;margin-block-start:12px;margin-block-end:6px;justify-content:end}.Metadata_root__oCstk.Metadata_authorInDescription__hW1wb:not(.Metadata_expanded__uLdy4) .author{display:none}.Metadata_root__oCstk.Metadata_authorInDescription__hW1wb.Metadata_expanded__uLdy4 .author{display:flex;grid-column:1/span 2;grid-row:5;justify-content:flex-start;margin-block-start:12px}.Metadata_root__oCstk .actions{display:none}.Metadata_root__oCstk .pills-list{margin-block-start:16px;margin-block-end:0}}.Metadata_root__oCstk .metadata-recs{grid-column:1/-1}.Title_root__svkHQ{font-size:clamp(26px,1vw + 1rem,28px);font-weight:600;line-height:1.25;min-width:0;word-break:break-word}.Heading_heading__3MAvZ,.Title_root__svkHQ{color:var(--blue-gray-900)}.Heading_h1__3k7S2{font-size:32px;font-weight:700}.Heading_h2__f9yvs{font-size:28px;font-weight:600}.Heading_h3__f1djd{font-size:24px}.Heading_h4__7tfLE{font-size:20px}.Heading_h5__jVM0l{font-size:16px;font-weight:400}.Heading_h6__uUTrd{font-size:14px;font-weight:400}.Stats_root__p_BoZ{flex-wrap:wrap;display:flex;align-items:center;-moz-column-gap:6px;column-gap:6px;color:var(--blue-gray-600);font-size:16px}.Stats_leftContent__588PR,.Stats_rightContent__8d0AF{display:flex;gap:6px}@media screen and (max-width:928px){.Stats_root__p_BoZ.Stats_extendedMetadata__wb62p .Stats_leftContent__588PR{width:100%}.Stats_root__p_BoZ.Stats_extendedMetadata__wb62p .Stats_formatTypesBullet__xDv0L{display:none}}.Likes_root__WVQ1_{cursor:pointer;transition:color .2s ease-in-out;border-radius:4px}.Likes_root__WVQ1_:hover{color:var(--blue-gray-700)}.Author_root___6Bx5{--link-color:var(--blue-gray-800);position:relative;display:flex;align-items:center;gap:8px}.Author_link___lVxw{z-index:1;color:var(--link-color);font-weight:600;display:block}.Author_link___lVxw:before{content:"";position:absolute;inset:0}.Author_follow__Lw4TS{z-index:1}@media screen and (max-width:928px){.Author_link___lVxw:hover{color:var(--blue-gray-800)}}.Avatar_root__GNWHY{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;background-color:var(--white);color:var(--blue-gray-300);border-radius:50%;font-size:16px;font-weight:600;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden}.Avatar_initials__EJfVt{color:var(--white);transition:background-color .2s ease-in-out}.Avatar_initials__EJfVt,.Avatar_initials__EJfVt:hover{background-color:var(--blue-gray-600)}.Avatar_image__Bbtll{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.FollowButton_root__FxpBi{display:inline-flex;background-color:transparent;border:1px solid transparent;border-radius:4px;font-size:12px;padding:1px 6px;transition:background-color .2s ease-in-out,border-color .2s ease-in-out;cursor:pointer}.FollowButton_following__xKCww{border-color:#bf5905;color:#bf5905}.FollowButton_following__xKCww:hover{background-color:#ffead7;border-color:rgba(191,89,5,.5)}.FollowButton_follow__d_6u5{border-color:var(--celadon-blue-dark);color:var(--celadon-blue-dark)}.FollowButton_follow__d_6u5:hover{background-color:#eaf7ff;border-color:rgba(2,126,176,.5)}@media screen and (max-width:928px){.FollowButton_root__FxpBi{display:none}}.Description_root__kt4uq{--line-height:26px;position:relative}.Description_root__kt4uq.Description_clamped__PaV_1{padding-bottom:25px}.Description_root__kt4uq.Description_clamped__PaV_1 .Description_wrapper__hYE9_{mask-image:linear-gradient(to bottom,var(--white),transparent);-webkit-mask-image:linear-gradient(to bottom,var(--white),transparent)}.Description_wrapper__hYE9_{min-height:var(--line-height);display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}.Description_noClamp__1z7c5,.Description_wrapper__hYE9_.Description_expanded__lRamt{-webkit-line-clamp:unset;-webkit-mask-image:none;mask-image:none}.Description_wrapper__hYE9_.Description_expanded__lRamt{height:auto}.Description_wrapper__hYE9_ p{color:var(--blue-gray-600);font-size:18px;line-height:var(--line-height);white-space:pre-wrap;word-break:break-word}.Description_root__kt4uq button{padding-inline:0}.Description_root__kt4uq .Description_more__ChrRK{position:absolute;padding:0;bottom:0;height:26px}.Description_root__kt4uq .Description_less__BvWbY{display:none}@media screen and (max-width:928px){.Description_root__kt4uq .Description_more__ChrRK{right:0;background-color:#fff}.Description_root__kt4uq.Description_clamped__PaV_1{padding-bottom:0}.Description_root__kt4uq .Description_less__BvWbY,.Description_root__kt4uq .Description_more__ChrRK{display:flex;height:var(--line-height)}}.Description_root__kt4uq .Description_less__BvWbY.Description_hidden__a9QZJ,.Description_root__kt4uq .Description_more__ChrRK.Description_hidden__a9QZJ{display:none}.PillsList_root__2EydN{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.Pill_root__IqOYH{--bg:color-mix(in srgb,var(--celadon-blue-dark),90% transparent);--color:var(--blue-gray-800);height:40px;display:inline-flex;align-items:center;gap:6px;background-color:var(--bg);border-radius:100vmax;color:var(--color);font-size:16px;font-weight:600;padding-inline:16px;transition:color .2s ease-in-out,background-color .2s ease-in-out,filter .2s ease-in-out;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;text-decoration:none;white-space:nowrap}.Pill_root__IqOYH:not(.Pill_selected__VPtHm):hover{filter:brightness(.6)}.Pill_root__IqOYH.Pill_selected__VPtHm{--bg:var(--blue-gray-900);--color:var(--white)}@media screen and (max-width:520px){.Pill_root__IqOYH{height:28px;padding-inline:12px;gap:4px;font-size:12px}.Pill_icon__xE_Cg{--size:18px!important}}.Actions_root__00yIC{display:flex;gap:6px;align-items:baseline;min-height:44px}@media screen and (max-width:928px){.Actions_root__00yIC{min-height:35px}.Actions_root__00yIC .gallery-view-button{padding-inline:0;margin-inline-end:auto}}@media (min-width:929px){.Actions_root__00yIC .fullscreen-button,.Actions_root__00yIC .like-button,.Actions_root__00yIC .more-button,.Actions_root__00yIC .save-button{--size:44px;border:1px solid var(--blue-gray-200)}}button.GalleryViewButton_root__s4Nw4{--size:32px;color:var(--blue-gray-700)}button.GalleryViewButton_root__s4Nw4:hover{background-color:transparent}@media only screen and (min-width:929px){button.GalleryViewButton_root__s4Nw4{display:none}}.Tooltip_root__7FS0Y{background:var(--midnight-green-dark);border-radius:4px;box-shadow:0 .5px 5px rgba(0,0,0,.04),0 4px 11px rgba(0,0,0,.2);color:var(--white);font-weight:400;font-size:12px;line-height:15px;padding:6px 8px;opacity:0;visibility:hidden;animation:Tooltip_show__qVG5k .2s ease-in-out forwards;z-index:var(--popup-index)}.Tooltip_triggerWrapper___S2HG{flex-shrink:0;position:relative;align-items:center;justify-content:center}@keyframes Tooltip_show__qVG5k{to{opacity:1;visibility:visible}}.Tooltip_large__J4Fvl{padding:16px;display:flex;flex-direction:column;background:#fff;color:var(--black)}.SaveLoggedIn_icon__lk74r{color:var(--blue-gray-700)}.SaveOptionsDrawer_drawerTrigger__Gb7nK{box-shadow:none;border:none;border-radius:4px;position:relative;z-index:7}.SaveOptionsDrawer_drawerTrigger__Gb7nK:active,.SaveOptionsDrawer_drawerTrigger__Gb7nK:active:focus,.SaveOptionsDrawer_drawerTrigger__Gb7nK:hover{border:none;box-shadow:none;background-color:transparent}.SaveOptionsDrawer_drawerTrigger__Gb7nK:focus{background:transparent}.SaveOptionsDrawerContent_drawerContent__J5JTL{margin:16px}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_separator__UW5Rz{margin:8px 0}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_itemsContainer__tCXw5{display:flex;flex-direction:column;margin-top:0;max-height:144px;overflow-y:auto}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_drawerActionSecondary__7cq8j{font-weight:400;line-height:24px;padding:0 8px;margin:8px 0;width:100%}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_drawerActionSecondary__7cq8j span{color:var(--blue-gray-800);justify-content:space-between;gap:30px}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_drawerActionPrimary____QuR span{gap:14px}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_drawerActionPrimary____QuR{color:var(--blue-gray-800);display:flex;font-weight:400;line-height:24px;align-items:center;justify-content:flex-start;padding:8px 4px;margin:14px 0}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_drawerActionPrimary____QuR.SaveOptionsDrawerContent_newListButton__VzhfD{font-size:16px;font-weight:600}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_addIcon__Wb2cq{color:var(--blue-gray-800)}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_drawerActionSecondary__7cq8j span.SaveOptionsDrawerContent_clampLines__zfkfI{display:inline-block;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap;width:calc(100vw - 115px)}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_listIcon__5dcfC{color:var(--blue-gray-900)}.SaveOptionsDrawerContent_drawerContent__J5JTL .SaveOptionsDrawerContent_noSavedLists__cpUBY{color:var(--blue-gray-600);font-weight:400;font-size:16px;line-height:24px;padding:12px 16px;text-align:center}.Separator_root__70Ime{--orientationMargin:0;background-color:var(--blue-gray-200);flex-shrink:0}.Separator_horizontal__czVEa{width:calc(100% - var(--orientationMargin) * 2);height:1px}.Separator_vertical__JYCCK{width:1px;height:calc(100% - var(--orientationMargin) * 2)}.SaveLoggedOut_icon__ny9X2{color:var(--blue-gray-700)}.MoreDropdownButton_root__ciXL6{width:100%;padding:0 16px}.MoreDropdownButton_list__VI5Ah{list-style-type:none;padding:0;margin:0}.MoreDropdownButton_item__t4HmI{margin:8px 0}.MoreDropdownButton_actionButton__gJ41E{color:var(--black);display:flex;align-items:center;font-size:16px;height:48px;gap:12px}.MoreDropdownButton_actionButton__gJ41E:focus{outline:none}.MoreDropdownButton_drawerHeading__chh4X{margin:24px 0;display:flex;align-items:center}.MoreDropdownButton_moreOptionsIcon__TpJLA{color:var(--blue-gray-700)}.MoreDropdownButton_icon__DxfY4{color:var(--blue-gray-800)}.MoreDropdownButton_tooltip__az4od{white-space:nowrap}.MoreDropdownButton_trigger__x7wGs{width:44px;height:44px;border-radius:4px}@media (max-width:928px){.MoreDropdownButton_trigger__x7wGs{width:32px;height:32px}}.ReportForm_root__REyLj{display:grid;grid-gap:12px;gap:12px;font-size:1rem;color:var(--blue-gray-800)}.ReportForm_root__REyLj label,.ReportForm_row__dXO5W{display:flex;align-items:center;gap:12px}.ReportForm_root__REyLj label{gap:8px}.ReportForm_root__REyLj label:has(input[type=radio]:checked){font-weight:600;color:var(--blue-gray-900)}.ReportForm_root__REyLj input[type=radio]{accent-color:var(--celadon-blue)}.ReportForm_root__REyLj select{width:100%;display:block;height:40px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:url('data:image/svg+xml;utf8,<svg fill="lightgray" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px"><path d="M7 10l5 5 5-5z"/></svg>') no-repeat right 8px center;border:1px solid var(--blue-gray-300);border-radius:4px;color:var(--blue-gray-600);font-size:1rem;padding-block:4px;padding-inline:16px;margin-block-start:8px}.ReportForm_root__REyLj select.changed{background-image:url('data:image/svg+xml;utf8,<svg fill="lightgray" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px"><path d="M7 10l5 5 5-5z"/></svg>');color:var(--blue-gray-900)}.ReportForm_root__REyLj a{color:var(--celadon-blue);font-weight:600;text-decoration:none}.ReportForm_root__REyLj p{color:var(--blue-gray-700)}.ReportForm_actions__LPSXn{display:flex;gap:12px;justify-content:flex-end;margin-block-start:8px}.ReportForm_copyrightPolicy__z8QMf{display:unset}.ReportForm_info__2Xs_1{max-width:200px;padding-inline:16px;padding-block:20px}.ReportForm_error__bC3zN{display:flex;align-items:center;gap:8px;border-radius:8px;background-color:#f2dede;color:var(--blue-gray-800);padding-inline:16px;padding-block:12px;margin-block-end:16px}.Modal_root__TYkzh[open]{transform:translateY(0)}.Modal_root__TYkzh{--max-height:calc(100dvb - var(--header-height));--title-size:80px;width:-moz-max-content;width:max-content;max-height:var(--max-height);place-self:center;border-radius:var(--border-radius);transform:translateY(8px)}@starting-style{.Modal_root__TYkzh[open]{transform:translateY(8px)}}.Modal_root__TYkzh.Modal_small__hupRE{width:400px}.Modal_root__TYkzh.Modal_medium__j8NOV{width:600px}.Modal_root__TYkzh.Modal_large__ygVmr{width:800px}.Modal_root__TYkzh.Modal_xlarge__HeXWk{width:960px}.Modal_wrapper__4UTGq{position:relative;display:grid}.Modal_wrapper__4UTGq .modal-content{flex:1 1;max-height:calc(var(--max-height) - var(--title-size));overflow:clip auto}@media screen and (max-width:520px){.Modal_root__TYkzh,.Modal_root__TYkzh.Modal_large__ygVmr,.Modal_root__TYkzh.Modal_medium__j8NOV,.Modal_root__TYkzh.Modal_small__hupRE,.Modal_root__TYkzh.Modal_xlarge__HeXWk{width:100vw}}@media screen and (max-width:928px){.Modal_root__TYkzh.Modal_bottomPlacement__BUbfp{width:100vw;top:unset;bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}}.Modal_title__xhSfl{height:var(--title-size);display:flex;align-items:center;color:var(--blue-gray-900);font-size:20px;font-weight:600;border-bottom:1px solid var(--blue-gray-200);padding-inline-start:20px;padding-inline-end:60px}.Modal_title__xhSfl:first-letter{text-transform:capitalize}.Modal_content__R1F4d{padding-inline:20px;padding-block:24px}.Modal_root__TYkzh:has(.Modal_actions__t63hZ) .Modal_content__R1F4d{padding-block-end:96px}.Modal_actions__t63hZ{position:absolute;inset-inline:0;bottom:0;display:flex;align-items:center;justify-content:flex-end;gap:24px;background-color:var(--white);padding-inline:20px;padding-block:16px}.MetadataToolbar_root__c03ao{--shadow-opacity:0;position:sticky;display:grid;height:var(--metadata-toolbar-height);background-color:var(--white);z-index:var(--header-index)}.MetadataToolbar_wrapper__r7XEc{position:relative;display:grid;grid-template-columns:minmax(0,1fr) max-content 1fr;align-items:center;padding-inline-end:20px;padding-block:16px}.MetadataToolbar_underline__QQn0C{grid-column:1/-1;grid-row:2;height:1px;position:absolute;bottom:0;right:-20px;left:-30vw;background-color:var(--blue-gray-200);box-shadow:0 2px 4px 0 rgba(0 0 0/var(--shadow-opacity));animation:MetadataToolbar_reveal-shadow__5yBxP linear both;animation-timeline:scroll(block);animation-range:150px 450px}.MetadataToolbar_title__jfTWv{font-size:18px;font-weight:600}.MetadataToolbar_actions__FB33C{width:-moz-max-content;width:max-content;justify-self:flex-end;align-self:flex-start;display:flex;grid-column-end:-1}.MetadataToolbar_pageNumber__i6Bhj{display:inline-flex;align-items:center;margin-inline:1em;height:44px}@media screen and (max-width:928px){.MetadataToolbar_root__c03ao{display:none}}@keyframes MetadataToolbar_reveal-shadow__5yBxP{to{--shadow-opacity:0.122}}.DownloadButton_root__adY00{margin-left:auto;display:inline-grid;gap:6px;justify-items:center;flex-shrink:0;text-align:center}.DownloadButton_savedStyling__k18od{font-weight:600;font-size:18px}.DownloadMultipleFormatDrawer_root__CWFxX{width:100%;padding:0 24px}.DownloadMultipleFormatDrawer_drawerHeading__8LnFw{margin:16px 0}.DownloadMultipleFormatDrawer_drawerContent__y815X{width:100%;padding:24px 0}.DownloadMultipleFormatDrawer_drawerRadioButtons__I_lQ4 label{margin-bottom:20px}.DownloadMultipleFormatDrawer_drawerRadioButtons__I_lQ4{margin-bottom:4px}.Fieldset_root__L2NQU{display:grid;padding:0;border:0}.Fieldset_root__L2NQU legend{display:none}.DownloadMultipleFormatPopover_popoverContent__IJudF{min-width:185px}.PopoverMenuContent_root__MsRtR{background:var(--white);box-shadow:0 .5px 5px rgba(0,0,0,.04),0 4px 11px rgba(0,0,0,.2);border-radius:4px;opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility .2s ease-in-out;z-index:1000}.PopoverMenuContent_root__MsRtR.PopoverMenuContent_visible__O86I_{opacity:1;visibility:visible;transition-delay:0s}.PopoverMenuItem_item__iazpP{width:100%;display:flex;align-items:center;background-color:transparent;color:inherit;cursor:pointer;font-size:inherit;line-height:24px;padding:12px 16px;white-space:nowrap}.PopoverMenuItem_item__iazpP.PopoverMenuItem_highlight__inbqK,.PopoverMenuItem_item__iazpP:hover{background-color:var(--blue-gray-100)}.PopoverMenuSeparator_separator__UpSGw{width:calc(100% - 32px);height:1px;background-color:var(--blue-gray-300);margin:8px 16px}.Player_root__L1AmF{position:relative;min-width:0;background-color:var(--snow-gray);padding:20px}.Player_root__L1AmF.Player_isInfographic__iQpvH{background-color:unset;padding-inline-start:1px;padding-inline-end:20px}@media (max-width:928px){.Player_root__L1AmF,.Player_root__L1AmF.Player_isInfographic__iQpvH{background-color:unset;padding-inline:2px}}.VerticalPlayer_root__K8_YS{position:relative;display:grid;grid-template-columns:minmax(0,1fr);grid-gap:24px;gap:24px}@media screen and (max-width:928px){.VerticalPlayer_root__K8_YS{gap:8px}}.VerticalSlide_root__jU_9r{position:relative}.VerticalSlide_root__jU_9r .vertical-slide-image{position:absolute;inset:0}.VerticalSlide_root__jU_9r>.save-slide{position:absolute;top:12px;right:12px}@media only screen and (max-width:928px){.VerticalSlide_root__jU_9r .save-slide-button{--size:32px;background-color:var(--blue-gray-100)}}.VerticalSlideImage_root__64KSA{position:relative;width:100%;height:100%;box-shadow:0 0 0 1px var(--blue-gray-200);border-radius:8px;overflow:clip}.VerticalSlideImage_image__VtE4p{-o-object-fit:contain;object-fit:contain;opacity:0;transition:opacity .3s var(--ease)}.VerticalSlideImage_image__VtE4p.VerticalSlideImage_loaded__Q7FLb{opacity:1}.VerticalSlideActions_root__azvaH{display:flex;flex-direction:column;gap:12px;position:absolute;top:12px;right:12px;bottom:12px;opacity:1;transition:opacity .3s ease-in .1s;z-index:1}@starting-style{.VerticalSlideActions_root__azvaH{opacity:0}}button.VerticalSlideActions_downloadButton__ancDu{border-radius:4px;color:var(--blue-gray-700);background-color:var(--blue-gray-100)}button.VerticalSlideActions_fullscreen__5CkK_{background-color:var(--blue-gray-100);color:var(--blue-gray-700);margin-block-start:auto}@media (max-width:928px){.VerticalSlideActions_root__azvaH>div:first-child{display:none}}.SaveSlide_root__k6Uis{color:var(--blue-gray-700)}.SaveSlide_root__k6Uis button.SaveSlide_button__w0PF7{background-color:var(--blue-gray-100);font-size:18px;line-height:24px;color:var(--blue-gray-700);padding:0 8px;min-width:32px;transition:min-width .2s ease-in-out}.FreestarVideoAd_root__KDWgl{min-width:0;flex-shrink:0;aspect-ratio:16/9}.SlideRecs_root__likA5{--card-hover-background:var(--blue-gray-200);display:flex;flex-direction:column;gap:20px}.SlideRecs_root__likA5 h2{font-size:24px;font-weight:600}@media (max-width:1050px){.SlideRecs_root__likA5{display:none}}.SlideRecs_root__likA5 .SlideRecs_cards__Lbxtt{display:grid;grid-gap:16px;gap:16px}.SlideRecs_root__likA5 .SlideRecs_card__txc2D{position:relative;grid-template-columns:180px 1fr;grid-template-rows:auto;gap:16px}.SlideRecs_root__likA5 .slideshow-thumbnail{box-shadow:0 0 0 1px var(--blue-gray-200)}.SlideRecs_root__likA5 .slideshow-card-content{padding-block:0;padding-inline-end:36px;gap:8px}.SlideRecs_root__likA5 .slideshow-title{line-height:1;margin-block-end:0}.SlideRecs_root__likA5 .SlideRecs_wrapper__21j_w{display:flex;gap:8px;align-items:center}.SlideRecs_root__likA5 .SlideRecs_wrapper__21j_w a,.SlideRecs_root__likA5 .SlideRecs_wrapper__21j_w span{font-size:12px}.SlideRecs_root__likA5 .SlideRecs_save__RR8dD{position:absolute;top:8px;right:8px}.SlideRecs_root__likA5 .SlideRecs_author__zlhWO{color:var(--blue-gray-700);font-weight:600;text-decoration:none;z-index:2}.SlideRecs_root__likA5 .SlideRecs_author__zlhWO:first-letter{text-transform:uppercase}.SlideRecs_root__likA5 .SlideRecs_card__txc2D .slideshow-title{font-size:16px}.SlideRecs_root__likA5 .SlideRecs_description__0bGsx{color:var(--blue-gray-700);font-size:14px;display:-webkit-box;overflow:hidden;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical}.SlideRecs_root__likA5 .SlideRecs_dot__Db7HR{font-size:16px}.SlideRecs_root__likA5 .SlideRecs_tags__RCA1q{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.SlideRecs_root__likA5 .SlideRecs_tags__RCA1q span{display:grid;place-content:center;height:20px;background-color:var(--alice-blue-600);border-radius:100vmax;color:var(--blue-gray-700);font-size:11px;font-weight:600;padding-inline:12px;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;text-transform:capitalize;z-index:2}.SlideshowCard_root__pD8t4{position:relative;display:grid;grid-template-rows:max-content minmax(0,1fr);grid-template-columns:minmax(0,1fr);align-content:flex-start;color:var(--blue-gray-600)}.SlideshowCard_root__pD8t4:hover .SlideshowCard_thumb__86aJk{scale:1.02}.SlideshowCard_content__xh7kV{display:grid;padding:16px 0;grid-template-columns:1fr 32px;grid-template-rows:auto;grid-row-gap:4px;row-gap:4px}.SlideshowCard_content__xh7kV .slideshow-right-side{grid-column-start:2;grid-row-start:1;grid-row-end:span 3}.SlideshowCard_content__xh7kV .slideshow-author,.SlideshowCard_content__xh7kV .slideshow-stats,.SlideshowCard_content__xh7kV .slideshow-title,.SlideshowCard_content__xh7kV .slideshow-type{grid-column-start:1}.SlideshowCard_content__xh7kV .slideshow-author,.SlideshowCard_content__xh7kV .slideshow-stats{margin-block-start:auto}.SlideshowCardLink_root__p8KI7{position:absolute;inset:0;z-index:1;margin:4px}.Thumbnail_root__qLW0K{--ease:cubic-bezier(0.2,0,0,1);position:relative;background-color:var(--blue-gray-100);border:1px solid var(--blue-gray-100);border-radius:8px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);scale:1;transition:scale .2s var(--ease);overflow:hidden}.Thumbnail_thumb__UXO3a{--reveal-delay:calc(30ms * var(--index));position:absolute;inset:0;width:100%;height:100%;opacity:0;transition:opacity .3s var(--ease);transition-delay:var(--reveal-delay)}.Thumbnail_loaded__XOJ5p{opacity:1}.Thumbnail_blur__opK6A{filter:blur(8px)}.Thumbnail_cover__1zsIi{-o-object-fit:cover;object-fit:cover}.Thumbnail_contain__K6M0d{-o-object-fit:contain;object-fit:contain}.SlideshowTitle_root__2VccW{display:-webkit-box;color:var(--blue-gray-900);font-size:18px;font-weight:600;line-height:1.2;margin-bottom:8px;white-space:break-spaces;word-break:break-word;-webkit-box-orient:vertical}.RecSaveButton_icon__btwCp{color:var(--blue-gray-700);z-index:2}.SlideshowStats_root__EQOR1{display:flex;align-items:center;gap:6px}.SlideshowStats_text___WD7l{color:var(--blue-gray-600)}.SlideshowAuthor_root__IkT1_{color:var(--celadon-blue);font-weight:600;text-decoration:underline;-webkit-text-decoration-color:transparent;text-decoration-color:transparent;text-decoration-thickness:1.5px;text-underline-offset:2px;transition:-webkit-text-decoration-color .2s ease-out;transition:text-decoration-color .2s ease-out;transition:text-decoration-color .2s ease-out,-webkit-text-decoration-color .2s ease-out;z-index:2}.SlideshowAuthor_root__IkT1_:hover{-webkit-text-decoration-color:var(--celadon-blue);text-decoration-color:var(--celadon-blue)}.CountTag_root__y1hE1,.SplitDot_root__lTZDc{color:var(--blue-gray-600);font-weight:400}.VerticalInterstitialAdWrapper_root__LxQh8{container-type:inline-size;position:relative;display:grid;min-height:280px;overflow-x:clip}.VerticalInterstitialAdWrapper_root__LxQh8:has(.interstitial-ad-container.has-fetched):not(:has(.interstitial-ad-container.has-fetched .freestar-ad-container:not(.unfilled))){display:none}.VerticalInterstitialAdWrapper_root__LxQh8:has(div.interstitial-ad-container.has-fetched div.freestar-ad-container.filled div),.VerticalInterstitialAdWrapper_root__LxQh8:has(div.interstitial-ad-container.has-fetched div.freestar-ad-container.unfilled iframe){display:grid!important}.VerticalInterstitial_root__Dunl7{display:none}@container (max-width: 480px){.VerticalInterstitial_root__Dunl7{display:block;justify-self:center;align-self:center}}.FreestarAdContainer_root__qPPC_{position:relative;display:grid;place-content:center}.FreestarAdContainer_root__qPPC_.FreestarAdContainer_withFallback__A4lgm{aspect-ratio:var(--fallback-aspect-ratio)}.FreestarAdContainer_fallback__WreT9{position:absolute;inset:0;grid-template-columns:unset;place-content:center}.AdFallback_root__uAXsl{display:grid;justify-items:center;grid-template-columns:1fr;z-index:0}.MultipleIncontentSmall_root__x58Hs{display:none;grid-template-columns:repeat(auto-fit,minmax(max-content,300px));place-content:center;gap:16px}@container (min-width: 616px) and (max-width: 688px){.MultipleIncontentSmall_root__x58Hs{display:grid}}.MultipleIncontentWide_root__4WD8U{display:none;place-content:center}@container (min-width: 480px) and (max-width: 616px){.MultipleIncontentWide_root__4WD8U{display:grid}}.MultipleIncontentLarge_root__pGIAn{display:none;grid-template-columns:repeat(auto-fit,minmax(max-content,336px));place-content:center;gap:16px}@container (min-width: 688px){.MultipleIncontentLarge_root__pGIAn{display:grid}}.BelowReaderAd_root__NKeGg{margin-top:16px;margin-bottom:60px}.BelowReaderAd_root__NKeGg.BelowReaderAd_desktop__7_JN7{display:block;justify-items:flex-start}.BelowReaderAd_root__NKeGg.BelowReaderAd_mobile__08T3d{display:none}.BelowReaderAd_root__NKeGg .fallback-ad{justify-self:flex-start}@media screen and (max-width:928px){.BelowReaderAd_root__NKeGg.BelowReaderAd_desktop__7_JN7{display:none}.BelowReaderAd_root__NKeGg.BelowReaderAd_mobile__08T3d{display:block;justify-items:center}}.Sidebar_root__1BbNu{width:var(--sidebar-size);max-height:100dvh;overflow:clip scroll;position:sticky;top:var(--metadata-toolbar-offset,0);display:flex;flex-direction:column;padding-inline-start:28px;padding-block-start:32px;padding-block-end:430px}.Sidebar_root__1BbNu.Sidebar_withSidebarAds__0w0dT{max-height:unset;overflow:unset;position:static;top:unset;display:grid;grid-template-rows:repeat(var(--slots),1fr);padding-inline:28px}@media (max-width:1050px){.Sidebar_root__1BbNu,.Sidebar_root__1BbNu.Sidebar_withSidebarAds__0w0dT{display:none}}.AboveRecsAd_root__iTmTR{min-height:280px;margin-block-end:32px}.AboveRecsAd_root__iTmTR .freestar-ad-container{place-content:flex-start}@media (max-width:1050px){.AboveRecsAd_root__iTmTR .freestar-ad-container{place-content:center}}.AboveRecsAd_mobileAd__LYgqf{display:none}.AboveRecsAd_desktopAd__ymykj{display:block}@media (max-width:1050px){.AboveRecsAd_mobileAd__LYgqf{display:block}.AboveRecsAd_desktopAd__ymykj{display:none}}.RailRecommendations_root__zqtZQ{display:flex;flex-direction:column;gap:8px;padding-block-end:24px}.RailRecommendations_title__kt1D2{font-size:24px;color:var(--blue-gray-900);font-weight:600;margin-block-end:20px}.RailCard_root__rZUGY{--card-hover-background:var(--blue-gray-100);width:100%;position:relative;padding-block:12px}.RailCard_root__rZUGY.slideshow-card{grid-template-columns:160px minmax(0,1fr);grid-template-rows:auto;gap:12px}.RailCard_root__rZUGY .slideshow-card-content{padding:0}.RailCard_link__d3BBm{z-index:1}.RailCard_root__rZUGY .RailCard_title__Tvfiv{font-size:16px}.RailCard_stats__ZvZms .text{font-size:12px}.RailCard_root__rZUGY .RailCard_author__JYeYZ{color:var(--blue-gray-700);text-decoration:none}@media screen and (min-width:929px){.RailCard_root__rZUGY:hover{background-color:var(--blue-gray-100)}}.RelatedContent_root__29Np1{background-color:var(--blue-gray-100);border-top:1px solid var(--blue-gray-200);border-bottom:1px solid var(--blue-gray-200);padding-block:32px;position:relative}.RelatedContent_wrapper__riU7l{display:grid;grid-template-columns:minmax(0,1fr);grid-gap:32px;gap:32px;max-width:var(--max-content-width);margin-inline:auto}.RelatedContent_title__QUhpL{text-align:center;font-size:32px;font-weight:700}@media screen and (max-width:520px){.RelatedContent_wrapper__riU7l{padding-inline:16px}}.BottomRecommendation_root__7aU9w{display:grid;grid-gap:4px;gap:4px;padding-inline:24px}.BottomRecommendation_title__SRj68{font-size:22px;font-weight:600}.BottomRecommendation_count__4HpLo{font-size:16px;font-weight:400}@media screen and (max-width:520px){.BottomRecommendation_root__7aU9w{padding-inline:0}}.BottomRecommendationContent_root__2qm4_{display:grid}.BottomRecommendationContent_hidden__CUlxl{display:none}.BottomRecommendationContent_root__2qm4_ .mobile-recs{display:grid}.BottomRecommendationContent_root__2qm4_ .desktop-recs{display:none}@media screen and (min-width:520px){.BottomRecommendationContent_root__2qm4_ .mobile-recs{display:none}.BottomRecommendationContent_root__2qm4_ .desktop-recs{display:flex}}.Slider_root__c0Jo8{position:relative;display:grid}.Slider_scroller__KHjw4{display:flex;gap:20px;overflow:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;max-inline-size:100%;min-block-size:100%;touch-action:pan-x;-ms-overflow-style:none;scrollbar-width:none}.Slider_scroller__KHjw4::-webkit-scrollbar{display:none}.Slider_scroller__KHjw4>*{flex-grow:1;flex-shrink:0;scroll-snap-align:start}.Slider_scroller__KHjw4>:last-child{scroll-snap-align:end}.Slider_arrow__8LCca{display:grid;place-content:center;width:36px;height:36px;position:absolute;top:50%;background:var(--white);border:1px solid var(--blue-gray-200);border-radius:100vmax;box-shadow:0 2px 4px 0 rgba(0,0,0,.25);color:var(--blue-gray-800);padding:0;opacity:1;visibility:visible;pointer-events:all;transition:opacity .2s ease-in-out,visibility .2s ease-in-out;transition-delay:0s;cursor:pointer;z-index:1}.Slider_prev__YMssa{left:0;translate:-50% -50%}.Slider_next__fa9IO{right:0;translate:50% -50%}.Slider_hidden__rs7nK{opacity:0;visibility:hidden;pointer-events:none}.BottomRecommendationCard_root__gffTk{inline-size:clamp(220px,12.63rem + 3.45vw,260px);position:relative;background-color:none}.BottomRecommendationCard_root__gffTk .slideshow-thumbnail{border:1px solid var(--blue-gray-200)}.ScribdRecommendation_root__t3ezS{display:grid;grid-gap:16px;gap:16px;padding:0 24px}.ScribdRecommendation_header__Jw_M1{display:grid;grid-template-columns:1fr max-content}.ScribdRecommendation_title__JZ5p7{font-size:22px;font-weight:600}.ScribdRecommendation_link__4DVQz{align-self:end;grid-column:2;grid-row:1/span 2;color:var(--celadon-blue-dark)}.ScribdRecommendation_link__4DVQz:hover{color:var(--celadon-blue)}.ScribdRecommendationCard_root__ef2Y_{--rec-bg-1:#f1e3e3;--rec-bg-2:#f6f4e3;--rec-bg-3:#e1eaec;--rec-bg-4:#efebef;--rec-bg-5:#f1f0f0;--rec-bg-6:#f4eadb;--rec-bg-7:#eaeee7;--rec-bg-8:#e3e8ef;--rec-bg-9:#f1eee6;max-width:172px;position:relative;height:100%;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:max-content minmax(0,1fr);align-content:flex-start;background-color:var(--white);border:1px solid var(--blue-gray-200);box-shadow:none;transition:box-shadow .2s ease-in-out;text-decoration:none}.ScribdRecommendationCard_root__ef2Y_:hover{box-shadow:0 2px 10px rgba(0,0,0,.1)}.ScribdRecommendationCard_thumb__5VVNh{position:relative;display:flex;background-color:var(--blue-gray-200);margin-block-start:24px;margin-inline:20px}.ScribdRecommendationCard_root__ef2Y_:before{position:absolute;inset:0;aspect-ratio:19/16;content:"";background-color:var(--block-color)}.ScribdRecommendationCard_thumb__5VVNh img{--reveal-delay:calc(30ms * var(--card-index));aspect-ratio:inherit;box-shadow:0 4px 6px rgba(0,0,0,.2);-o-object-fit:cover;object-fit:cover;opacity:0;visibility:hidden;transition:opacity .3s var(--ease);transition-delay:var(--reveal-delay)}.ScribdRecommendationCard_loaded__FTN_f img{opacity:1;visibility:visible}.ScribdRecommendationCard_content__ObcvL{display:flex;flex-direction:column;padding-block:20px;padding-inline:16px}.ScribdRecommendationCard_content__ObcvL .rating{padding-block-start:8px;margin-block-start:auto}@media (max-width:928px){.ScribdRecommendationCard_content__ObcvL .rating{flex-direction:column;align-items:flex-start}}.Rating_root__fgZQJ{display:flex;align-items:center;-moz-column-gap:6px;column-gap:6px;white-space:nowrap}.Rating_root__fgZQJ :first-child{color:#e47b01;font-size:16px;line-height:1}.Rating_root__fgZQJ :last-child{color:var(--blue-gray-600);font-size:14px;letter-spacing:-.25px}.Transcript_root__Vrf6Q{width:100%;max-width:var(--max-content-width);display:grid;grid-gap:8px;gap:8px;padding:32px 16px;margin-inline:auto;position:relative;background:#fff}.Transcript_title__YgAka{display:flex;align-items:center;gap:4px;font-weight:300;word-break:break-word}.Transcript_list__faItj{list-style-type:none;padding-inline-start:0;word-break:break-word}.Transcript_link__MLbGS{color:var(--celadon-blue);font-weight:700;line-height:22px;text-decoration:none;cursor:pointer}.EditorsNotes_root__3PcDF{padding:32px 16px;margin:0 auto}.EditorsNotes_heading__XR9E6{font-weight:700;font-size:22px}.EditorsNotes_list__NcG5Y{padding-left:30px;font-size:18px;font-style:italic;color:var(--blue-gray-600)}.EditorsNotes_item__ebBbj{word-break:break-word}@media screen and (min-width:1696px){.EditorsNotes_root__3PcDF{max-width:1688px}}.ActionsMenu_root__4k507{display:flex;gap:12px;align-items:center;justify-content:flex-start;min-height:44px;position:sticky;bottom:0;z-index:var(--sticky-index);height:var(--actions-menu-height);padding:0 15px;background-color:#fff;box-shadow:0 1.85px 6.25px 0 #00000030}.ActionsMenu_root__4k507 .ActionsMenu_downloadButton__s7Iqj{justify-self:flex-end}@media (min-width:929px){.ActionsMenu_root__4k507{display:none}}.LikeModal_more__R9uAk{justify-self:center;color:var(--celadon-blue);font-weight:500;opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility .2s ease-in-out}.LikeModal_more__R9uAk.LikeModal_visible__t1vr4{opacity:1;visibility:visible;transition-delay:0s}.LikesUserList_root__RMFUk{list-style:none;padding:0 0 16px;margin:0}.LikesUserList_root__RMFUk>li{display:grid}.LikesUserList_root__RMFUk>li:last-child .LikesUserList_link__NeMA0{border-bottom:none}.LikesUserList_link__NeMA0{display:grid;grid-template-columns:repeat(2,max-content) 1fr;grid-template-rows:repeat(2,min-content);grid-template-areas:"avatar username summary" "avatar title title";grid-column-gap:12px;-moz-column-gap:12px;column-gap:12px;grid-row-gap:0;row-gap:0;border-bottom:1px solid var(--blue-gray-200);padding:8px 0;text-decoration:none}.LikesUserList_avatar__VRXz2{grid-area:avatar}.LikesUserList_username__c84om{grid-area:username}.LikesUserList_summary___gbSG{grid-area:summary}.LikesUserList_title__UF0V6{grid-area:title}.ViewModal_content__GPKXy{padding-block:0}.ViewModal_row__xLxnz{display:flex;justify-content:space-between;border-bottom:1px dashed var(--blue-gray-300);color:var(--blue-gray-800);padding:16px 0}.ViewModal_row__xLxnz:last-child{border-bottom:none}.ConfirmRemoveSavedModal_description__2EAEu{color:var(--blue-gray-800);font-weight:400;font-size:16px;line-height:20px;padding:24px 0}div.SaveToNewListModal_input__Fi90k{max-width:unset;margin-bottom:24px}.SaveToNewListModal_checkboxWrapper__y_w0m .SaveToNewListModal_checkboxLabel__lMiU9:hover,.SaveToNewListModal_checkboxWrapper__y_w0m:hover .SaveToNewListModal_checkboxLabel__lMiU9,.SaveToNewListModal_checkboxWrapper__y_w0m:hover .SaveToNewListModal_input__Fi90k{color:var(--blue-gray-800)}.SaveToNewListModal_checkboxWrapper__y_w0m .SaveToNewListModal_checkboxLabel__lMiU9{color:var(--blue-gray-800);font-weight:400;font-size:14px;flex-direction:column;display:flex;line-height:18px}.SaveToNewListModal_imageContainer__Dx4nD{display:flex;flex-direction:column;justify-content:center;align-items:center;width:178px;margin:0 auto 24px}.SaveToNewListModal_imageContainer__Dx4nD img{height:100px}.SaveToNewListModal_errorContainer__FBZPH{margin:16px 0}dialog.FullscreenModal_root__efM9m[open]{animation:none;opacity:1;scale:1}dialog.FullscreenModal_root__efM9m{--max-height:100dvh;width:100dvw;height:100dvh;border-radius:0;opacity:0;scale:.96}dialog.FullscreenModal_root__efM9m .FullscreenModal_content__bQ6mt{width:100svw;height:100svh;display:grid;padding:0;max-height:100svh}@starting-style{dialog.FullscreenModal_root__efM9m[open]{opacity:0;scale:.96}} /*# sourceMappingURL=f2d403b314115c89.css.map*/</style></head><body><noscript><iframe title="gtm-noscript" src="https://www.googletagmanager.com/ns.html?id=GTM-M36RG8PT" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="__next"><div class="__variable_4d9a39 __className_4d9a39" style="overflow:clip"><div class="PageProgressBar_root__1y_Q3"><div class="PageProgressBar_bar__Kyoem" style="transform:scaleX(0)"></div></div><div data-freestar-ad="__320x50 __1140x90" id="slideshare_pushdown-pushdown-cls" style="height:var(--pushdown-height)"></div><header class="Header_root__8A86O"><div class="Header_wrapper___zBfP"><button aria-label="Open navigation menu" class="Hamburger_root__tHlgC" data-cy="mobile-header-menu" type="button"><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/hamburger.5a525941.svg);background-color:currentColor"></span><span class="sr-only"></span></span></button><dialog id=":R9am:" class="drawer Drawer_root__ob4ZM" data-placement="left"><div class="Drawer_content__ye6ZB"></div><button autofocus="" type="button" aria-label="Close" class="close-button CloseButton_root__JCTRm" data-cy="drawer-close-button"><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/close.393923c4.svg);background-color:currentColor"></span><span class="sr-only"></span></span></button></dialog><a aria-label="SlideShare a Scribd company logo" class="Logo_root__Qba3h" data-cy="slideshare-logo" title="Return to the homepage" href="https://www.slideshare.net/"><img alt="SlideShare a Scribd company logo" loading="lazy" width="120" height="30" decoding="async" data-nimg="1" style="color:transparent" srcSet="https://public.slidesharecdn.com/images/next/svg/logo/slideshare-scribd-company.svg?w=128&q=75 1x, https://public.slidesharecdn.com/images/next/svg/logo/slideshare-scribd-company.svg?w=256&q=75 2x" src="https://public.slidesharecdn.com/images/next/svg/logo/slideshare-scribd-company.svg?w=256&q=75"/></a></div><div class="SearchForm_root__usp4s"><form data-testid="search-form" role="search"><input name="searchfrom" type="hidden" value="header"/><input type="text" autoComplete="off" aria-label="Search SlideShare" id="nav-search-query" data-cy="search-field" name="q" placeholder="Search" value=""/><button type="submit" class="SearchForm_submit__U8kPR" id="search-submit" data-cy="search-submit"><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/search.844a289d.svg);background-color:currentColor"></span><span class="sr-only">Submit Search</span></span></button></form></div><div class="HeaderActions_root__11_ai undefined"></div></header><div class="SlideshowScreen_root__k9j1_ SlideshowScreen_withKeyMoments__RbHLe"><!--$--><div class="metadata Metadata_root__oCstk" data-cy="metadata"><h1 class="Heading_heading__3MAvZ Heading_h1__3k7S2 title Title_root__svkHQ">Improving the Design of Existing Software</h1><div class="stats Stats_root__p_BoZ Stats_extendedMetadata__wb62p"><div class="Stats_leftContent__588PR"><time dateTime="2017-10-26 14:59:36 UTC"><span class="skeleton Skeleton_root__U4QqL Skeleton_rounded__BLBq2" style="width:75px;height:24px"></span></time><span class="Text_root__is73U Text_medium__rk8Tn text" style="-webkit-line-clamp:0">•</span><span class="Text_root__is73U Text_medium__rk8Tn text" style="-webkit-line-clamp:0">Download as PPTX, PDF</span><span class="Text_root__is73U Text_medium__rk8Tn Stats_formatTypesBullet__xDv0L text" style="-webkit-line-clamp:0">•</span></div><div class="Stats_rightContent__8d0AF"><span class="Text_root__is73U Text_weight-strong__yEO2S Text_secondary__EPWj0 Text_medium__rk8Tn Likes_root__WVQ1_ text" style="-webkit-line-clamp:0" tabindex="0">4 likes</span><span class="Text_root__is73U Text_medium__rk8Tn text" style="-webkit-line-clamp:0">•</span><span class="Text_root__is73U Text_weight-strong__yEO2S Text_secondary__EPWj0 Text_medium__rk8Tn Likes_root__WVQ1_ text" style="-webkit-line-clamp:0" tabindex="0">1,450<!-- --> <!-- -->views</span></div></div><div class="author Author_root___6Bx5"><div class="Avatar_root__GNWHY" style="width:24px;height:24px;line-height:24px"><img class="Avatar_image__Bbtll" src="https://cdn.slidesharecdn.com/profile-photo-ardalis-48x48.jpg?cb=1586530351" alt="Steven Smith" loading="lazy" decoding="sync"/></div><a class="Link_root__vn3ab Author_link___lVxw ellipsis Link_primary__Iq4CI Link_size-large__W0PAv Link_weight-regular__yPpnB" data-cy="author-link" title="Steven Smith" href="https://www.slideshare.net/ardalis">Steven Smith</a><button type="button" class="FollowButton_root__FxpBi Author_follow__Lw4TS FollowButton_follow__d_6u5">Follow</button></div><div class="description Description_root__kt4uq Description_clamped__PaV_1"><div class="Description_wrapper__hYE9_" data-cy="document-description"><p>The document discusses improving the design of existing software by following principles like DRY, SOLID, and refactoring code using techniques such as extracting classes, methods, and interfaces. It emphasizes writing characterization tests to preserve existing behavior when refactoring, and improving code quality by reducing duplication, dependencies, and complexity over time through preventative maintenance and refactoring.<button type="button" class="Button_root__i1yp0 Button_primary__K25Gq Button_text__ZT_3O Button_small__sqsEx Description_less__BvWbY Description_hidden__a9QZJ" data-testid="button" aria-label="Read less"><span>Read less</span></button></p></div><button type="button" class="Button_root__i1yp0 Button_primary__K25Gq Button_text__ZT_3O Button_small__sqsEx Description_more__ChrRK" data-testid="button" aria-label="Read more" data-cy="read-more-button"><span>Read more</span></button></div><div class="actions Actions_root__00yIC"><div class="Tooltip_triggerWrapper___S2HG"><button type="button" class="Button_root__i1yp0 Button_secondary__hHiHI Button_text__ZT_3O Button_small__sqsEx Button_icon__1C4qi like-button unliked" data-testid="button" aria-label="Like" data-favorited="false" data-cy="like-button"><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/like.3870b074.svg);background-color:#424766"></span><span class="sr-only"></span></span></button></div><div class="Tooltip_triggerWrapper___S2HG"><button type="button" class="Button_root__i1yp0 Button_secondary__hHiHI Button_text__ZT_3O Button_small__sqsEx Button_icon__1C4qi save-button" data-testid="button" aria-label="actions.save" data-saved="false" data-cy="loggedout-save-slideshow-button"><span class="Icon_root__AjZyv SaveLoggedOut_icon__ny9X2" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/save.ef1812e2.svg);background-color:currentColor"></span><span class="sr-only"></span></span></button></div><button type="button" class="unstyled-button more-button MoreDropdownButton_trigger__x7wGs" aria-label="More options" data-cy="more-options-icon" data-testid="ellipsis"><div class="Tooltip_triggerWrapper___S2HG"><span class="Icon_root__AjZyv MoreDropdownButton_moreOptionsIcon__TpJLA" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/more-horizontal.f69be1b8.svg);background-color:currentColor"></span><span class="sr-only"></span></span></div></button></div></div><div class="MetadataToolbar_root__c03ao metadata-toolbar" data-cy="slideshow-toolbar"><div class="MetadataToolbar_wrapper__r7XEc"><div class="actions Actions_root__00yIC"><div class="Tooltip_triggerWrapper___S2HG"><button type="button" class="Button_root__i1yp0 Button_secondary__hHiHI Button_text__ZT_3O Button_small__sqsEx Button_icon__1C4qi like-button unliked" data-testid="button" aria-label="Like" data-favorited="false" data-cy="like-button"><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/like.3870b074.svg);background-color:#424766"></span><span class="sr-only"></span></span></button></div><div class="Tooltip_triggerWrapper___S2HG"><button type="button" class="Button_root__i1yp0 Button_secondary__hHiHI Button_text__ZT_3O Button_small__sqsEx Button_icon__1C4qi save-button" data-testid="button" aria-label="actions.save" data-saved="false" data-cy="loggedout-save-slideshow-button"><span class="Icon_root__AjZyv SaveLoggedOut_icon__ny9X2" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/save.ef1812e2.svg);background-color:currentColor"></span><span class="sr-only"></span></span></button></div><button type="button" class="unstyled-button more-button MoreDropdownButton_trigger__x7wGs" aria-label="More options" data-cy="more-options-icon" data-testid="ellipsis"><div class="Tooltip_triggerWrapper___S2HG"><span class="Icon_root__AjZyv MoreDropdownButton_moreOptionsIcon__TpJLA" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/more-horizontal.f69be1b8.svg);background-color:currentColor"></span><span class="sr-only"></span></span></div></button></div><span data-cy="page-number" class="MetadataToolbar_pageNumber__i6Bhj">1<!-- --> <!-- -->of<!-- --> <!-- -->85</span><div class="MetadataToolbar_actions__FB33C"><div class="DownloadButton_root__adY00"><div><button type="button" class="Button_root__i1yp0 Button_primary__K25Gq Button_contained__gyjai Button_large__Yv_oe" data-testid="download-button" role="button" id=":R3h936:-trigger" tabindex="0" aria-haspopup="listbox" aria-controls=":R3h936:" data-cy="download-button-toolbar" label="Download now" aria-label="Download now"><span><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/download.b1b2622c.svg);background-color:currentColor"></span><span class="sr-only"></span></span>Download now</span></button></div><span class="sr-only" aria-live="polite"></span></div></div><div class="MetadataToolbar_underline__QQn0C"></div></div></div><!--/$--><!--$--><!--/$--><div class="player Player_root__L1AmF"><div id="new-player" class="vertical-player VerticalPlayer_root__K8_YS" data-slideshow-id="81246420"><div><div id="slide1" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-0" alt="Improving the Design of Existing Software Steve Smith Founder, DevIQ @ardalis | DevIQ.com " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="eager" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-1-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-1-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-1-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-1-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide2" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-1" alt="My Pluralsight Courses " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-2-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-2-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-2-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-2-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide3" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-2" alt="Weekly DevTips Podcast and Newsletter • Ardalis.com/tips • WeeklyDevTips.com " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-3-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-3-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-3-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-3-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide4" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-3" alt="Software Rots " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-4-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-4-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-4-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-4-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide5" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-4" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-5-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-5-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-5-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-5-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide6" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-5" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-6-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-6-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-6-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-6-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide7" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-6" alt="Technical Debt • Low quality code and shortcuts in our applications • Financial Debt • Principal – Amount borrowed • Interest – Additional cost of the debt • Technical debt • Principal – Amount of time required to code solution “properly” • Interest – Additional time needed to work around improper code http://deviq.com/technical-debt/ " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-7-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-7-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-7-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-7-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide8" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-7" alt="http://www.jimhighsmith.com/ " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-8-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-8-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-8-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-8-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide9" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-8" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-9-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-9-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-9-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-9-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide10" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-9" alt="A Well-Designed Application is Simple to Maintain and Extend " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-10-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-10-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-10-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-10-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide11" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-10" alt="Technical Debt is a Design Decision (or series of decisions) " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-11-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-11-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-11-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-11-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide12" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-11" alt="Paying DownTechnical Debt Improves Application Design and Quality " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-12-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-12-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-12-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-12-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide13" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-12" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-13-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-13-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-13-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-13-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide14" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-13" alt="Preventive Maintenance • Refactoring • Eliminate Duplication • Simplify Design • AutomatedTests • Verify correctness • Avoid regressions • Increase Confidence " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-14-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-14-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-14-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-14-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide15" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-14" alt="When should you refactor? • While delivering value " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-15-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-15-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-15-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-15-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide16" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-15" alt="“ ” You don’t need permission to practice basic hygiene when you write software. http://ardalis.com/when-should-you-refactor/ Make cleaning up your code something you do as part of writing code. " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-16-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-16-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-16-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-16-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide17" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-16" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-17-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-17-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-17-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-17-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide18" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-17" alt="Refactoring Should Not Change System Behavior " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-18-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-18-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-18-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-18-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide19" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-18" alt="The Refactoring Process • Verify existing behavior • Write CharacterizationTests if none exist • Find test points • Break dependencies • Apply Refactoring • Confirm existing behavior is preserved Commit the working code! Commit the working code! " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-19-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-19-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-19-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-19-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide20" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-19" alt="CharacterizationTests Process 1. Write a test you know will fail 2. Use the output of the failing test to determine the existing behavior to assert 3. Update the test with the new value/behavior 4. Run the test again – it should now pass " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-20-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-20-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-20-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-20-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide21" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-20" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-21-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-21-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-21-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-21-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide22" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-21" alt="Brownfield / Legacy Development " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-22-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-22-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-22-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-22-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide23" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-22" alt="Maximize Code Changes Made to New Classes " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-23-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-23-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-23-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-23-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide24" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-23" alt="Why new classes? • Nothing depends on them (yet) • You can write them to be testable • Even in an otherwise hard-to-test application " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-24-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-24-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-24-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-24-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide25" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-24" alt="Add High-ValueTests to Legacy Apps • Probably not writtenTest-First • Trying to UnitTest Everything is likely cost-prohibitive • Start by writing tests for bugs • Verify the bug behavior with a test • Make the test pass by fixing the bug " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-25-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-25-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-25-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-25-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide26" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-25" alt="S O L I DPrinciples http://flickr.com/photos/kevinkemmerer/2772526725/ " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-26-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-26-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-26-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-26-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide27" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-26" alt="Principles of OO Design 0. Don’t RepeatYourself (DRY) 1. Single Responsibility 2. Open/Closed 3. Liskov Substitution 4. Interface Segregation 5. Dependency Inversion Pluralsight Course: http://bit.ly/SOLID-OOP " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-27-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-27-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-27-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-27-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide28" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-27" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-28-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-28-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-28-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-28-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide29" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-28" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-29-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-29-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-29-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-29-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide30" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-29" alt="Don’t Repeat RepeatYourself •Duplication in logic calls for abstraction •Duplication in process calls for automation " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-30-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-30-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-30-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-30-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide31" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-30" alt="Common Refactorings • Replace Magic Number/String • Parameterize Method • Pull Up Field • Pull Up Method • Replace Conditional With Polymorphism • Introduce Method " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-31-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-31-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-31-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-31-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide32" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-31" alt="Common Source of Repetition: Role Checks if(user.IsInRole(“Admins”) { // allow access to resource } // favor privileges over role checks // ardalis.com/Favor-Privileges-over-Role-Checks var priv = new ContentPrivilege(user, article); if(priv.CanEdit()) { // allow access } " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-32-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-32-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-32-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-32-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide33" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-32" alt="Visual Studio Code Clones • Find similar blocks of code in your projects/solution • Can detect matches that are similar but vary in small ways (like variable names) • Available inVS2015 Premium and Ultimate " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-33-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-33-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-33-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-33-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide34" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-33" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-34-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-34-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-34-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-34-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide35" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-34" alt="Single Responsibility Principle The Single Responsibility Principle states that every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class. Wikipedia There should never be more than one reason for a class to change. Robert C. “Uncle Bob” Martin " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-35-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-35-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-35-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-35-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide36" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-35" alt="What is a responsibility? “My CustomerManager class is only responsible for anything to do with a Customer.That follows SRP, right?” " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-36-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-36-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-36-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-36-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide37" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-36" alt="Examples of Responsibilities • Persistence • Validation • Notification • Error Handling • Logging • Class Selection / Construction • Formatting • Parsing • Mapping " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-37-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-37-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-37-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-37-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide38" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-37" alt="Dependency and Coupling • Excessive coupling makes changing legacy software difficult • Breaking apart responsibilities and dependencies is a large part of working with existing code " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-38-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-38-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-38-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-38-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide39" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-38" alt="Common Refactorings • Extract Class • Extract Method • Move Method " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-39-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-39-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-39-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-39-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide40" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-39" alt="Heuristics and Code Smells • Visual Studio Metrics " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-40-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-40-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-40-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-40-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide41" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-40" alt="Cyclomatic Complexity https://en.wikipedia.org/wiki/Cyclomatic_complexity " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-41-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-41-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-41-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-41-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide42" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-41" alt="Keep Cyclomatic Complexity under 10 for every method " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-42-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-42-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-42-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-42-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide43" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-42" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-43-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-43-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-43-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-43-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide44" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-43" alt="Code Smell: Regions More on Regions: http://ardalis.com/regional-differences " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-44-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-44-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-44-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-44-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide45" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-44" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-45-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-45-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-45-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-45-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide46" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-45" alt="Open / Closed Principle The Open / Closed Principle states that software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification. Wikipedia " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-46-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-46-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-46-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-46-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide47" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-46" alt="Open / Closed Principle Open to Extension New behavior can be added in the future Closed to Modification Changes to source or binary code are not required Dr. Bertrand Meyer originated the OCP term in his 1988 book, ObjectOrientedSoftwareConstruction " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-47-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-47-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-47-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-47-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide48" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-47" alt="Common Refactorings • Extract Interface / Apply Strategy Pattern • Parameterize Method • FormTemplate Method " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-48-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-48-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-48-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-48-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide49" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-48" alt="OCP Fail " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-49-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-49-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-49-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-49-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide50" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-49" alt="OCP OK " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-50-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-50-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-50-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-50-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide51" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-50" alt="OCP Fail public bool IsSpecialCustomer(Customer c) { if(c.Country == “US” && c.Balance < 50) return false; if(c.Country == “DE” && c.Balance < 25) return false; if(c.Country == “UK” && c.Balance < 35) return false; if(c.Country == “FR” && c.Balance < 27) return false; if(c.Country == “BG” && c.Balance < 29) return false; if(c.Age < 18 || c.Age > 65) return false; if(c.Income < 50000 && c.Age < 30) return false; return true; } " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-51-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-51-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-51-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-51-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide52" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-51" alt="OCP OK private IEnumerable<ICustomerRule> _rules; public bool IsSpecialCustomer(Customer customer) { foreach(var rule in _rules) { if(rule.Evaluate(customer) == false) return false; } return true; } " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-52-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-52-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-52-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-52-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide53" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-52" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-53-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-53-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-53-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-53-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide54" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-53" alt="Liskov Substitution Principle The Liskov Substitution Principle states that Subtypes must be substitutable for their base types. Agile Principles, Patterns, and Practices in C# Named for Barbara Liskov, who first described the principle in 1988. " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-54-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-54-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-54-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-54-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide55" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-54" alt="Common Refactorings • Collapse Hierarchy • Pull Up / Push Down Field • Pull Up / Push Down Method " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-55-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-55-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-55-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-55-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide56" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-55" alt="Liskov Substitution Fail foreach(var employee in employees) { if(employee is Manager) { Helpers.PrintManager(employee as Manager); break; } Helpers.PrintEmployee(employee); } " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-56-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-56-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-56-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-56-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide57" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-56" alt="Liskov Substitution OK foreach(var employee in employees) { employee.Print(); // or Helpers.PrintEmployee(employee); } " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-57-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-57-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-57-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-57-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide58" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-57" alt="Nulls Break Polymorphism foreach(var employee in employees) { if(employee == null) { // print not found message break; } Helpers.PrintEmployee(employee); } http://ardalis.com/nulls-break-polymorphism " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-58-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-58-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-58-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-58-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide59" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-58" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-59-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-59-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-59-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-59-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide60" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-59" alt="Interface Segregation Principle The Interface Segregation Principle states that Clients should not be forced to depend on methods they do not use. Agile Principles, Patterns, and Practices in C# Corollary: Prefer small, cohesive interfaces to “fat” interfaces " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-60-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-60-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-60-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-60-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide61" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-60" alt="Common Refactorings • Extract Interface " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-61-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-61-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-61-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-61-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide62" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-61" alt="Keep Interfaces Small and Focused " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-62-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-62-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-62-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-62-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide63" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-62" alt="Membership Provider " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-63-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-63-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-63-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-63-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide64" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-63" alt="ISP Fail (sometimes) public IRepository<T> { T GetById(int id); IEnumerable<T> List(); void Create(T item); void Update(T item); void Delete(T item); } " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-64-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-64-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-64-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-64-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide65" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-64" alt="ISP OK (i.e. to support CQRS) public IRepository<T> : IReadRepository<T>, IWriteRepository<T> { } public IReadRepository<T> { T GetById(int id); IEnumerable<T> List(); } public IWriteRepository<T> void Create(T item); void Update(T item); void Delete(T item); } Existing implementations of IRepository<T> are unaffected by pulling out smaller interfaces! No existing code breaks! " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-65-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-65-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-65-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-65-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide66" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-65" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-66-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-66-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-66-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-66-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide67" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-66" alt="Dependency Inversion Principle High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions. Agile Principles, Patterns, and Practices in C# " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-67-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-67-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-67-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-67-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide68" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-67" alt="Dependency Inversion Principle • Depend on Abstractions • Interfaces, not concrete types • Inject Dependencies into Classes • Structure Solution so Dependencies FlowToward Core • Onion Architecture (a.k.a. Ports and Adapters, a.k.a. Hexagonal Architecture) " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-68-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-68-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-68-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-68-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide69" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-68" alt="DIP Architecture (aka Ports and Adapters) " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-69-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-69-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-69-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-69-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide70" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-69" alt="Common Dependencies • Framework • Third Party Libraries • Database • File System • Email • Web Services • System Resources (Clock) • Configuration • The new Keyword • Static methods • Thread.Sleep • Random See also responsibilities: • Persistence • Validation • Notification • Error Handling • Logging • Class Selection / Construction • Formatting • Parsing • Mapping " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-70-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-70-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-70-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-70-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide71" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-70" alt="Common Refactorings • Extract Class • Extract Interface / Apply Strategy Pattern • Extract Method • Introduce Service Locator / Container " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-71-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-71-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-71-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-71-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide72" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-71" alt="DIP Fail " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-72-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-72-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-72-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-72-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide73" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-72" alt="Hidden Dependencies • Checkout Depends on an available SMTP server, but the class doesn’t reflect this • Follow the Explicit Dependencies Principle • http://deviq.com/explicit-dependencies-principle/ " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-73-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-73-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-73-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-73-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide74" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-73" alt="Some Improvement (Façade) " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-74-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-74-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-74-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-74-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide75" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-74" alt="DIP OK (Strategy Pattern / DI) " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-75-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-75-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-75-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-75-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide76" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-75" alt="DIP OK (Strategy Pattern / DI) " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-76-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-76-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-76-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-76-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide77" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-76" alt="Improving Quality Across the Industry " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-77-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-77-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-77-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-77-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide78" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-77" alt="Improving the Design of Existing Software" class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-78-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-78-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-78-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-78-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide79" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-78" alt="Self-Improvement and Quality • How fast can you produce: • Code you believe to be of high quality • Code that maybe gets the job done, but you believe to be of low quality • Which one can you produce more quickly? • Why? • How can we develop our skills and our tools so that building quality is natural and easier than not doing so? " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-79-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-79-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-79-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-79-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide80" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-79" alt="0 2 4 6 8 10 12 14 16 Week 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 9 User Stories Completed High Quality Low Quality " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-80-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-80-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-80-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-80-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide81" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-80" alt="0 2 4 6 8 10 12 14 16 18 20 Week 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 9 User Stories Completed High Quality Low Quality " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-81-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-81-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-81-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-81-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide82" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-81" alt="Summary •Maintain / Improve Application Code •Follow DRY/SOLID Principles •Use CharacterizationTests to “fix” behavior •Apply Common Refactorings •Re-runTestsAfter (and during) Refactorings •Be Explicit About Class Dependencies •Train and Practice toWrite Better Code Faster " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-82-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-82-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-82-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-82-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide83" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-82" alt="Learn More • DevIQ.com • Ardalis.com • WeeklyDevTips.com • Twitter: @ardalis • Pluralsight: • SOLID Principles of OO Design http://bit.ly/SOLID-OOP • N-Tier Architecture in C# http://bit.ly/PS-NTier1 • Refactoring Fundamentals http://bit.ly/PS-Refactoring • Domain-Driven Design Fundamentals http://bit.ly/ddd-fundamentals • Design Pattern Library http://bit.ly/PS-design-patterns • Pair Programming http://bit.ly/PS-PairProgramming " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-83-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-83-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-83-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-83-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide84" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-83" alt="• New Coworking Space in Hudson,Ohio • Private offices / Flex desk spaces • Fiber internet • Complimentary coffee / tea / water • Great development community • @techhubhudson • Website online soon Tech Hub Hudson " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-84-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-84-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-84-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-84-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div><div><div id="slide85" class="VerticalSlide_root__jU_9r slide-item" style="aspect-ratio:960 / 540" data-cy="slide-container"><div class="VerticalSlideImage_root__64KSA"><img id="slide-image-84" alt="Books Refactoring http://amzn.to/110tscA Refactoring to Patterns http://amzn.to/Vq5Rj2 Working Effectively with Legacy Code http://amzn.to/VFFYbn Code Complete http://amzn.to/Vq5YLv Clean Code http://amzn.to/YjUDI0 " class="vertical-slide-image VerticalSlideImage_image__VtE4p" data-testid="vertical-slide-image" loading="lazy" srcSet="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-85-320.jpg 320w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-85-638.jpg 638w, https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/75/Improving-the-Design-of-Existing-Software-85-2048.jpg 2048w" src="https://image.slidesharecdn.com/improvingthedesignofexistingsoftware-171026145936/85/Improving-the-Design-of-Existing-Software-85-320.jpg" sizes="100vw"/></div><!--$--><!--/$--></div></div></div></div></div><!--$--><div class="RelatedContent_root__29Np1"><div class="RelatedContent_wrapper__riU7l"><h2 class="Heading_heading__3MAvZ Heading_h2__f9yvs RelatedContent_title__QUhpL">More Related Content</h2><div></div><div></div><div id="between-recs-ad-1-container" class="freestar-ad-container FreestarAdContainer_root__qPPC_" style="--fallback-aspect-ratio:undefined / undefined"><div><div class="" id="between-recs-ad-1"></div></div></div><div></div><div id="between-recs-ad-2-container" class="freestar-ad-container FreestarAdContainer_root__qPPC_" style="--fallback-aspect-ratio:undefined / undefined"><div><div class="" id="between-recs-ad-2"></div></div></div><div></div></div></div><!--/$--><div class="Transcript_root__Vrf6Q"><h2 class="Transcript_title__YgAka"><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/file.5db1ba24.svg);background-color:currentColor"></span><span class="sr-only"></span></span>Improving the Design of Existing Software</h2><div><ul class="Transcript_list__faItj"><div><li>1. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#1">Improving the Design </a> of Existing Software Steve Smith Founder, DevIQ @ardalis | DevIQ.com </li></div><div><li>2. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#2">My Pluralsight Courses </a> </li></div><div><li>3. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#3">Weekly DevTips Podcast and </a> Newsletter • Ardalis.com/tips • WeeklyDevTips.com </li></div><div><li>4. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#4">Software Rots </a></li></div><div></div><div></div><div><li>7. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#7">Technical Debt • Low </a> quality code and shortcuts in our applications • Financial Debt • Principal – Amount borrowed • Interest – Additional cost of the debt • Technical debt • Principal – Amount of time required to code solution “properly” • Interest – Additional time needed to work around improper code http://deviq.com/technical-debt/ </li></div><div><li>8. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#8">http://www.jimhighsmith.com/ </a></li></div><div></div><div><li>10. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#10">A Well-Designed Application is Simple to Maintain </a> and Extend </li></div><div><li>11. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#11">Technical Debt is a Design </a> Decision (or series of decisions) </li></div><div><li>12. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#12">Paying DownTechnical Debt Improves Application </a> Design and Quality </li></div><div></div><div><li>14. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#14">Preventive Maintenance • Refactoring • </a> Eliminate Duplication • Simplify Design • AutomatedTests • Verify correctness • Avoid regressions • Increase Confidence </li></div><div><li>15. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#15">When should you </a> refactor? • While delivering value </li></div><div><li>16. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#16">“ ” You don’t need </a> permission to practice basic hygiene when you write software. http://ardalis.com/when-should-you-refactor/ Make cleaning up your code something you do as part of writing code. </li></div><div></div><div><li>18. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#18">Refactoring Should Not </a> Change System Behavior </li></div><div><li>19. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#19">The Refactoring Process • </a> Verify existing behavior • Write CharacterizationTests if none exist • Find test points • Break dependencies • Apply Refactoring • Confirm existing behavior is preserved Commit the working code! Commit the working code! </li></div><div><li>20. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#20">CharacterizationTests Process 1. Write a </a> test you know will fail 2. Use the output of the failing test to determine the existing behavior to assert 3. Update the test with the new value/behavior 4. Run the test again – it should now pass </li></div><div></div><div><li>22. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#22">Brownfield / Legacy </a> Development </li></div><div><li>23. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#23">Maximize Code Changes Made </a> to New Classes </li></div><div><li>24. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#24">Why new classes? • </a> Nothing depends on them (yet) • You can write them to be testable • Even in an otherwise hard-to-test application </li></div><div><li>25. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#25">Add High-ValueTests to </a> Legacy Apps • Probably not writtenTest-First • Trying to UnitTest Everything is likely cost-prohibitive • Start by writing tests for bugs • Verify the bug behavior with a test • Make the test pass by fixing the bug </li></div><div><li>26. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#26">S O L </a> I DPrinciples http://flickr.com/photos/kevinkemmerer/2772526725/ </li></div><div><li>27. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#27">Principles of OO </a> Design 0. Don’t RepeatYourself (DRY) 1. Single Responsibility 2. Open/Closed 3. Liskov Substitution 4. Interface Segregation 5. Dependency Inversion Pluralsight Course: http://bit.ly/SOLID-OOP </li></div><div></div><div></div><div><li>30. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#30">Don’t Repeat RepeatYourself •Duplication in </a> logic calls for abstraction •Duplication in process calls for automation </li></div><div><li>31. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#31">Common Refactorings • Replace </a> Magic Number/String • Parameterize Method • Pull Up Field • Pull Up Method • Replace Conditional With Polymorphism • Introduce Method </li></div><div><li>32. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#32">Common Source of </a> Repetition: Role Checks if(user.IsInRole(“Admins”) { // allow access to resource } // favor privileges over role checks // ardalis.com/Favor-Privileges-over-Role-Checks var priv = new ContentPrivilege(user, article); if(priv.CanEdit()) { // allow access } </li></div><div><li>33. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#33">Visual Studio Code </a> Clones • Find similar blocks of code in your projects/solution • Can detect matches that are similar but vary in small ways (like variable names) • Available inVS2015 Premium and Ultimate </li></div><div></div><div><li>35. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#35">Single Responsibility Principle The </a> Single Responsibility Principle states that every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class. Wikipedia There should never be more than one reason for a class to change. Robert C. “Uncle Bob” Martin </li></div><div><li>36. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#36">What is a </a> responsibility? “My CustomerManager class is only responsible for anything to do with a Customer.That follows SRP, right?” </li></div><div><li>37. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#37">Examples of Responsibilities • </a> Persistence • Validation • Notification • Error Handling • Logging • Class Selection / Construction • Formatting • Parsing • Mapping </li></div><div><li>38. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#38">Dependency and Coupling • </a> Excessive coupling makes changing legacy software difficult • Breaking apart responsibilities and dependencies is a large part of working with existing code </li></div><div><li>39. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#39">Common Refactorings • Extract </a> Class • Extract Method • Move Method </li></div><div><li>40. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#40">Heuristics and Code </a> Smells • Visual Studio Metrics </li></div><div><li>41. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#41">Cyclomatic Complexity https://en.wikipedia.org/wiki/Cyclomatic_complexity </a></li></div><div><li>42. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#42">Keep Cyclomatic Complexity under 10 for </a> every method </li></div><div></div><div><li>44. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#44">Code Smell: Regions More </a> on Regions: http://ardalis.com/regional-differences </li></div><div></div><div><li>46. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#46">Open / Closed </a> Principle The Open / Closed Principle states that software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification. Wikipedia </li></div><div><li>47. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#47">Open / Closed </a> Principle Open to Extension New behavior can be added in the future Closed to Modification Changes to source or binary code are not required Dr. Bertrand Meyer originated the OCP term in his 1988 book, ObjectOrientedSoftwareConstruction </li></div><div><li>48. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#48">Common Refactorings • Extract </a> Interface / Apply Strategy Pattern • Parameterize Method • FormTemplate Method </li></div><div><li>49. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#49">OCP Fail </a></li></div><div><li>50. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#50">OCP OK </a></li></div><div><li>51. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#51">OCP Fail public bool </a> IsSpecialCustomer(Customer c) { if(c.Country == “US” && c.Balance < 50) return false; if(c.Country == “DE” && c.Balance < 25) return false; if(c.Country == “UK” && c.Balance < 35) return false; if(c.Country == “FR” && c.Balance < 27) return false; if(c.Country == “BG” && c.Balance < 29) return false; if(c.Age < 18 || c.Age > 65) return false; if(c.Income < 50000 && c.Age < 30) return false; return true; } </li></div><div><li>52. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#52">OCP OK private IEnumerable<ICustomerRule> </a> _rules; public bool IsSpecialCustomer(Customer customer) { foreach(var rule in _rules) { if(rule.Evaluate(customer) == false) return false; } return true; } </li></div><div></div><div><li>54. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#54">Liskov Substitution Principle The </a> Liskov Substitution Principle states that Subtypes must be substitutable for their base types. Agile Principles, Patterns, and Practices in C# Named for Barbara Liskov, who first described the principle in 1988. </li></div><div><li>55. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#55">Common Refactorings • Collapse </a> Hierarchy • Pull Up / Push Down Field • Pull Up / Push Down Method </li></div><div><li>56. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#56">Liskov Substitution Fail foreach(var </a> employee in employees) { if(employee is Manager) { Helpers.PrintManager(employee as Manager); break; } Helpers.PrintEmployee(employee); } </li></div><div><li>57. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#57">Liskov Substitution OK foreach(var </a> employee in employees) { employee.Print(); // or Helpers.PrintEmployee(employee); } </li></div><div><li>58. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#58">Nulls Break Polymorphism foreach(var </a> employee in employees) { if(employee == null) { // print not found message break; } Helpers.PrintEmployee(employee); } http://ardalis.com/nulls-break-polymorphism </li></div><div></div><div><li>60. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#60">Interface Segregation Principle The </a> Interface Segregation Principle states that Clients should not be forced to depend on methods they do not use. Agile Principles, Patterns, and Practices in C# Corollary: Prefer small, cohesive interfaces to “fat” interfaces </li></div><div><li>61. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#61">Common Refactorings • Extract </a> Interface </li></div><div><li>62. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#62">Keep Interfaces Small </a> and Focused </li></div><div><li>63. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#63">Membership Provider </a></li></div><div><li>64. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#64">ISP Fail (sometimes) public </a> IRepository<T> { T GetById(int id); IEnumerable<T> List(); void Create(T item); void Update(T item); void Delete(T item); } </li></div><div><li>65. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#65">ISP OK (i.e. </a> to support CQRS) public IRepository<T> : IReadRepository<T>, IWriteRepository<T> { } public IReadRepository<T> { T GetById(int id); IEnumerable<T> List(); } public IWriteRepository<T> void Create(T item); void Update(T item); void Delete(T item); } Existing implementations of IRepository<T> are unaffected by pulling out smaller interfaces! No existing code breaks! </li></div><div></div><div><li>67. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#67">Dependency Inversion Principle High-level </a> modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions. Agile Principles, Patterns, and Practices in C# </li></div><div><li>68. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#68">Dependency Inversion Principle • </a> Depend on Abstractions • Interfaces, not concrete types • Inject Dependencies into Classes • Structure Solution so Dependencies FlowToward Core • Onion Architecture (a.k.a. Ports and Adapters, a.k.a. Hexagonal Architecture) </li></div><div><li>69. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#69">DIP Architecture (aka </a> Ports and Adapters) </li></div><div><li>70. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#70">Common Dependencies • Framework • </a> Third Party Libraries • Database • File System • Email • Web Services • System Resources (Clock) • Configuration • The new Keyword • Static methods • Thread.Sleep • Random See also responsibilities: • Persistence • Validation • Notification • Error Handling • Logging • Class Selection / Construction • Formatting • Parsing • Mapping </li></div><div><li>71. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#71">Common Refactorings • Extract </a> Class • Extract Interface / Apply Strategy Pattern • Extract Method • Introduce Service Locator / Container </li></div><div><li>72. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#72">DIP Fail </a></li></div><div><li>73. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#73">Hidden Dependencies • Checkout </a> Depends on an available SMTP server, but the class doesn’t reflect this • Follow the Explicit Dependencies Principle • http://deviq.com/explicit-dependencies-principle/ </li></div><div><li>74. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#74">Some Improvement (Façade) </a> </li></div><div><li>75. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#75">DIP OK (Strategy </a> Pattern / DI) </li></div><div><li>76. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#76">DIP OK (Strategy </a> Pattern / DI) </li></div><div><li>77. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#77">Improving Quality Across </a> the Industry </li></div><div></div><div><li>79. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#79">Self-Improvement and Quality • </a> How fast can you produce: • Code you believe to be of high quality • Code that maybe gets the job done, but you believe to be of low quality • Which one can you produce more quickly? • Why? • How can we develop our skills and our tools so that building quality is natural and easier than not doing so? </li></div><div><li>80. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#80">0 2 4 6 8 10 12 14 16 Week 1 Week </a> 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 9 User Stories Completed High Quality Low Quality </li></div><div><li>81. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#81">0 2 4 6 8 10 12 14 16 18 20 Week 1 Week </a> 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 9 User Stories Completed High Quality Low Quality </li></div><div><li>82. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#82">Summary •Maintain / Improve </a> Application Code •Follow DRY/SOLID Principles •Use CharacterizationTests to “fix” behavior •Apply Common Refactorings •Re-runTestsAfter (and during) Refactorings •Be Explicit About Class Dependencies •Train and Practice toWrite Better Code Faster </li></div><div><li>83. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#83">Learn More • DevIQ.com • </a> Ardalis.com • WeeklyDevTips.com • Twitter: @ardalis • Pluralsight: • SOLID Principles of OO Design http://bit.ly/SOLID-OOP • N-Tier Architecture in C# http://bit.ly/PS-NTier1 • Refactoring Fundamentals http://bit.ly/PS-Refactoring • Domain-Driven Design Fundamentals http://bit.ly/ddd-fundamentals • Design Pattern Library http://bit.ly/PS-design-patterns • Pair Programming http://bit.ly/PS-PairProgramming </li></div><div><li>84. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#84">• New Coworking </a> Space in Hudson,Ohio • Private offices / Flex desk spaces • Fiber internet • Complimentary coffee / tea / water • Great development community • @techhubhudson • Website online soon Tech Hub Hudson </li></div><div><li>85. <a class="Transcript_link__MLbGS" href="https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420#85">Books Refactoring http://amzn.to/110tscA </a> Refactoring to Patterns http://amzn.to/Vq5Rj2 Working Effectively with Legacy Code http://amzn.to/VFFYbn Code Complete http://amzn.to/Vq5YLv Clean Code http://amzn.to/YjUDI0 </li></div></ul></div></div><div class="EditorsNotes_root__3PcDF"><h3 class="Heading_heading__3MAvZ Heading_h3__f1djd EditorsNotes_heading__XR9E6">Editor's Notes</h3><ol class="EditorsNotes_list__NcG5Y"><li class="EditorsNotes_item__ebBbj">ONE HOUR</li><li class="EditorsNotes_item__ebBbj">How? Duplication Excess Coupling Quick Fixes Hacks </li><li class="EditorsNotes_item__ebBbj">Over time, neglect can turn software from well-oiled machinery into heaps of useless junk.</li><li class="EditorsNotes_item__ebBbj">Typically the low quality code was left because of the need to meet deadlines, but once in place, the justification for having put it there no longer matters. Whenever you are forced to work around the hacks, bad code, etc, in your application, the decrease in your productivity represents interest on technical debt. If you spend time refactoring the code to improve its quality, you are paying down the principal of the technical debt (and thus reducing future interest costs). Sometimes principal of technical debt can grow, as when a lot of code is built on top of debt-ridden code. There isn’t a perfect metaphor for this that I’m aware of.</li><li class="EditorsNotes_item__ebBbj">Accidental vs. Deliberate decision to incur the debt. Reckless vs. Prudent kinds of debt incurred.</li><li class="EditorsNotes_item__ebBbj">Should we spend an iteration or a month just trying to improve the quality of the system, and pay down technical debt? What would you think if you went to your favorite restaurant, only to find that it was closed for a month, with a sign explaining that it needed to clean up things that had gotten out of hand due to neglect. Would you feel as confident about eating the product of that kitchen, knowing it had let things go so wrong that it now needed a month without producing food just to clean up the mess it had created. How do you think our customers should feel if we request time to clean up our code instead of fixing bugs or delivering new features?</li><li class="EditorsNotes_item__ebBbj">Building in quality becomes a habit. Working with well-crafted code is more enjoyable. Create a virtuous cycle. Help yourself and your team fall into the pit of success that is clean code.</li><li class="EditorsNotes_item__ebBbj">By definition, refactoring attempts to improve the quality of a software application without changing its behavior. If you’re changing behavior, you’re not refactoring, you’re fixing a bug or adding a feature (hopefully – or adding a bug).</li><li class="EditorsNotes_item__ebBbj">Only refactor code while your tests are passing. Make sure they still pass when you are done. Break large refactorings into small steps and test after each step.</li><li class="EditorsNotes_item__ebBbj">Note that characterization tests, though they should be automated, are often not what we would think of as unit tests, or perhaps even integration tests. For instance, you could dump a log file showing the relevant state of the application, and then use that as the basis for your characterization test by comparing against it after your changes. </li><li class="EditorsNotes_item__ebBbj">Avoid creating a big ball of mud system, where tracing through your code and its dependencies is like trying to unwind a tangled mess of spaghetti.</li><li class="EditorsNotes_item__ebBbj">Principles provide guidance for refactoring. They provide a consistent target to aim toward.</li><li class="EditorsNotes_item__ebBbj">A very common source of repetition of code is role checks. These often describe different scenarios in different circumstances. For instance, maybe administrators can do anything, but managers can access resources within their division, etc. Encapsulating the logic of CanView, CanCreate, CanEdit, etc. in privilege objects makes these rules explicit, easier to test, and gives them a single location to live in the application.</li><li class="EditorsNotes_item__ebBbj">Visual Studio can quickly analyze a project and show statistics for the classes and methods in the project. The maintainability index, cyclomatic complexity, and lines of code are all great metrics to pay attention to. The ideal maintainability index is 100, but don’t expect to hit that with any code that’s doing real work. However, you should certainly able to keep it above 50. Demo GildedRose.</li><li class="EditorsNotes_item__ebBbj">Using Excel</li><li class="EditorsNotes_item__ebBbj">I’m not a fan of regions. They mainly exist because at one time they were a reasonable means of hiding generated code, before we had support for partial classes and other language features to deal with this. The worst offense with regions is when they’re used within a method, like this: (click) They’re also bad when used at the class level for “standard” formatting of code, making it impossible to actually see what the code does, like this: (click) Can someone tell me what this class does? (click) I have a whole article devoted to why using regions is a bad habit, anti-pattern, code smell, whatever you prefer. It includes some survey results on the most common ways people use them as well. (click)</li><li class="EditorsNotes_item__ebBbj">Open-Closed Principle</li><li class="EditorsNotes_item__ebBbj">Software can only be open to extension in a few different axes, and each additional bit of flexibility adds complexity to the software. Thus, this flexibility should be added only when needed, not simply anticipated.</li><li class="EditorsNotes_item__ebBbj">What happens when we need to add another country? What happens when we must add another rule? How can we refactor this so this method no longer needs to change? </li><li class="EditorsNotes_item__ebBbj">Define a type to describe a rule. Move each rule into its own type. Create a collection of rules to apply and apply them. Pass the set of rules into the IsSpecialCustomer() method’s class (or even the method itself).</li><li class="EditorsNotes_item__ebBbj">Any time you find that you need to check the type of an object within a polymorphic block of code (such as a foreach), this is a sign that you are breaking LSP.</li><li class="EditorsNotes_item__ebBbj">Nulls break polymorphism and violate LSP just as much as other subtypes that aren’t substitutable! Try to avoid the possibility of dealing with nulls in polymorphic code like foreach loops – consider using Null Object Pattern to address.</li><li class="EditorsNotes_item__ebBbj">This is an extemely common example of the Repository design pattern. In fact, I use this exact pattern in quite a few production applications today. There’s nothing inherently wrong with this implementation on its own. However, sometimes it does violate ISP if you need to separate Commands from Queries</li><li class="EditorsNotes_item__ebBbj">You can create small interfaces and compose the larger interfaces from the smaller ones if you control all of the code and you can’t simply do away with the larger interfaces. In this case, the separation of interfaces would allow us to do something like implement caching only on the read operations, and implement delayed writes using some kind of queue or message bus for the write operations.</li><li class="EditorsNotes_item__ebBbj">“Legacy” N-Tier Logical Architecture</li><li class="EditorsNotes_item__ebBbj">Hidden Dependencies</li><li class="EditorsNotes_item__ebBbj">Extract interface Implement interface with tightly coupled original code </li><li class="EditorsNotes_item__ebBbj">Mention Explicit Dependencies Principle</li><li class="EditorsNotes_item__ebBbj">Water break</li><li class="EditorsNotes_item__ebBbj">Get them excited.</li></ol></div><div class="actions-menu-container ActionsMenu_root__4k507" data-cy="actions-menu-mobile"><div class="Tooltip_triggerWrapper___S2HG"><button type="button" class="Button_root__i1yp0 Button_secondary__hHiHI Button_text__ZT_3O Button_small__sqsEx Button_icon__1C4qi save-button" data-testid="button" aria-label="actions.save" data-saved="false" data-cy="loggedout-save-slideshow-button"><span class="Icon_root__AjZyv SaveLoggedOut_icon__ny9X2" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/save.ef1812e2.svg);background-color:currentColor"></span><span class="sr-only"></span></span></button></div><button type="button" class="unstyled-button more-button MoreDropdownButton_trigger__x7wGs" aria-label="More options" data-cy="more-options-icon" data-testid="ellipsis"><div class="Tooltip_triggerWrapper___S2HG"><span class="Icon_root__AjZyv MoreDropdownButton_moreOptionsIcon__TpJLA" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/more-horizontal.f69be1b8.svg);background-color:currentColor"></span><span class="sr-only"></span></span></div></button><div class="DownloadButton_root__adY00 ActionsMenu_downloadButton__s7Iqj"><div><button type="button" class="Button_root__i1yp0 Button_primary__K25Gq Button_contained__gyjai Button_large__Yv_oe" data-testid="download-button" role="button" id=":R4j36:-trigger" tabindex="0" aria-haspopup="listbox" aria-controls=":R4j36:" data-cy="download-button-actions-menu" label="Download" aria-label="Download"><span><span class="Icon_root__AjZyv" style="--size:24px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/download.b1b2622c.svg);background-color:currentColor"></span><span class="sr-only"></span></span>Download</span></button></div><span class="sr-only" aria-live="polite"></span></div></div><dialog class="Modal_root__TYkzh FullscreenModal_root__efM9m" id=":Rn36:"><div class="Modal_wrapper__4UTGq"><div class="modal-content Modal_content__R1F4d FullscreenModal_content__bQ6mt"></div></div></dialog><div class="ad textads banner-ads banner_ads ad-unit ad-zone ad-space adsbox ads prebid" style="position:absolute;height:1px"></div><footer class="Footer_footer__N3WmV"><div class="FooterTop_wrapper__RuYz5" data-testid="footer-top"><div class="FooterTop_links__9J65v"><a class="Link_root__vn3ab Link_light__mcUPh Link_size-medium__ZLo12 Link_weight-bold__me4nt" href="/about">About</a><a class="Link_root__vn3ab Link_light__mcUPh Link_size-medium__ZLo12 Link_weight-bold__me4nt" href="https://support.scribd.com/hc/en/categories/360004792932-SlideShare?userType=SlideShare">Support</a><a class="Link_root__vn3ab Link_light__mcUPh Link_size-medium__ZLo12 Link_weight-bold__me4nt" href="https://support.scribd.com/hc/en/articles/210129326-General-Terms-of-Use">Terms</a><a class="Link_root__vn3ab Link_light__mcUPh Link_size-medium__ZLo12 Link_weight-bold__me4nt" href="https://support.scribd.com/hc/en/articles/210129366-Privacy-policy">Privacy</a><a class="Link_root__vn3ab Link_light__mcUPh Link_size-medium__ZLo12 Link_weight-bold__me4nt" href="/copyright-policy">Copyright</a><button class="FooterTop_cookiePreferenceButton__xmSox" type="button">Cookie Preferences</button><a class="Link_root__vn3ab Link_light__mcUPh Link_size-medium__ZLo12 Link_weight-bold__me4nt" href="https://support.scribd.com/hc/en-us/articles/360038016931-Privacy-Rights-Request-Form">Do not sell or share my personal information</a><a class="Link_root__vn3ab Link_light__mcUPh Link_size-medium__ZLo12 Link_weight-bold__me4nt" href="https://www.everand.com">Everand</a></div></div><hr class="Footer_separator__Qa1tj"/><div class="FooterBottom_wrapper__Gj9p_" data-testid="footer-bottom"><span class="FooterBottom_copyright__xltkG">© 2024 SlideShare from Scribd </span><div class="FooterBottom_icons__wEEhc"><a class="Link_root__vn3ab Link_light__mcUPh Link_size-large__W0PAv Link_weight-regular__yPpnB" aria-label="Slideshare on Twitter" href="https://twitter.com/slideshare"><span class="Icon_root__AjZyv" style="--size:18px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/twitter.89a06630.svg);background-color:currentColor"></span><span class="sr-only"></span></span></a><span class="FooterBottom_separator__181dN"></span><a class="Link_root__vn3ab Link_light__mcUPh Link_size-large__W0PAv Link_weight-regular__yPpnB" aria-label="Slideshare on RSS Feed" href="https://www.slideshare.net/rss/latest"><span class="Icon_root__AjZyv" style="--size:16px"><span class="Icon_icon__4zzsG" style="mask-image:url(https://public.slidesharecdn.com/_next/static/media/rss.5c914539.svg);background-color:currentColor"></span><span class="sr-only"></span></span></a></div></div></footer><div id="portals-container" style="z-index:1"><div id="banner-portal" class="PortalsContainer_bannerRoot__Q_sNw"></div></div></div></div><script src="https://cmp.osano.com/AzZdHGSGtpxCq1Cpt/079b27eb-bb3f-48dd-9bd9-3feb8aec3c38/osano.js"></script><script> // This script assumes the Osano script is synchronously loaded window.eventsToSend = window.eventsToSend || [] if (window.Osano) { window.eventsToSend.push({ name: "osano_loaded", timestamp: new Date().toISOString(), value: JSON.stringify({ time: performance?.now() }) }) } </script><script defer="" nomodule="" src="https://public.slidesharecdn.com/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="https://public.slidesharecdn.com/_next/static/chunks/webpack-fca657b2df1193b1.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/framework-0dfcca9a5dec51b3.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/main-4b9e5138f827276f.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/pages/_app-29d59c5f3fe3a369.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/5121-c12bfd4bed7c2139.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/5581-c31338dd77890eb2.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/4740-639dc16ecd764905.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/6229-23a3a93a4fd8bda9.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/chunks/pages/slideshow/%5Btitle%5D/%5Bid%5D-451dcf877ad69f2b.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/c2d26bae6c4ddd627835d4a0b06e445f4baa0ea6/_buildManifest.js" defer=""></script><script src="https://public.slidesharecdn.com/_next/static/c2d26bae6c4ddd627835d4a0b06e445f4baa0ea6/_ssgManifest.js" defer=""></script><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"name":"slideshow","edgeTestAssignments":[{"name":"example","variant":"A"},{"name":"fullscreen_view","variant":"C"},{"name":"gallery_view","variant":"B"},{"name":"nextjs_profile","variant":"B"},{"name":"reading_modes","variant":"A"},{"name":"recs_placement","variant":"A"},{"name":"recs_placement_v2","variant":"A"},{"name":"single_slide_view_v2","variant":"A"}],"layout":{"currentUser":null,"fullPath":"https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420","osanoId":"079b27eb-bb3f-48dd-9bd9-3feb8aec3c38","featureFlags":[{"name":"disable_facebook","enabled":true},{"name":"document_interstitials_flag","enabled":true},{"name":"recommendation_impression_tracking","enabled":true},{"name":"search_results_tracking","enabled":true},{"name":"view_restriction_without_subscription_after_five","enabled":true},{"name":"disable_lazy_hydration","enabled":false}]},"countryCodeFromFastly":"HK","slideshow":{"username":"ardalis","allowDownloads":true,"allowDownloadOriginalFile":true,"allowEmbeds":true,"canonicalUrl":"https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420","categories":[{"id":"16","name":"Technology","url":"technology"}],"createdAt":"2017-10-26 14:59:36 UTC","description":"The document discusses improving the design of existing software by following principles like DRY, SOLID, and refactoring code using techniques such as extracting classes, methods, and interfaces. It emphasizes writing characterization tests to preserve existing behavior when refactoring, and improving code quality by reducing duplication, dependencies, and complexity over time through preventative maintenance and refactoring.","downloadKey":"6f062bbff4d3b358d409d4280d1171ebb15b9b476ec39e0e3a3b632d7ff3712a","editorsNotes":["ONE HOUR","How?\rDuplication\rExcess Coupling\rQuick Fixes\rHacks\r\r","Over time, neglect can turn software from well-oiled machinery into heaps of useless junk.","Typically the low quality code was left because of the need to meet deadlines, but once in place, the justification for having put it there no longer matters. \rWhenever you are forced to work around the hacks, bad code, etc, in your application, the decrease in your productivity represents interest on technical debt. If you spend time refactoring the code to improve its quality, you are paying down the principal of the technical debt (and thus reducing future interest costs).\r\rSometimes principal of technical debt can grow, as when a lot of code is built on top of debt-ridden code. There isn’t a perfect metaphor for this that I’m aware of.","Accidental vs. Deliberate decision to incur the debt.\rReckless vs. Prudent kinds of debt incurred.","Should we spend an iteration or a month just trying to improve the quality of the system, and pay down technical debt?\r\rWhat would you think if you went to your favorite restaurant, only to find that it was closed for a month, with a sign explaining that it needed to clean up things that had gotten out of hand due to neglect. Would you feel as confident about eating the product of that kitchen, knowing it had let things go so wrong that it now needed a month without producing food just to clean up the mess it had created. How do you think our customers should feel if we request time to clean up our code instead of fixing bugs or delivering new features?","Building in quality becomes a habit. Working with well-crafted code is more enjoyable. Create a virtuous cycle. Help yourself and your team fall into the pit of success that is clean code.","By definition, refactoring attempts to improve the quality of a software application without changing its behavior. If you’re changing behavior, you’re not refactoring, you’re fixing a bug or adding a feature (hopefully – or adding a bug).","Only refactor code while your tests are passing. Make sure they still pass when you are done. Break large refactorings into small steps and test after each step.","Note that characterization tests, though they should be automated, are often not what we would think of as unit tests, or perhaps even integration tests. For instance, you could dump a log file showing the relevant state of the application, and then use that as the basis for your characterization test by comparing against it after your changes. ","Avoid creating a big ball of mud system, where tracing through your code and its dependencies is like trying to unwind a tangled mess of spaghetti.","Principles provide guidance for refactoring. They provide a consistent target to aim toward.","A very common source of repetition of code is role checks. These often describe different scenarios in different circumstances. For instance, maybe administrators can do anything, but managers can access resources within their division, etc. Encapsulating the logic of CanView, CanCreate, CanEdit, etc. in privilege objects makes these rules explicit, easier to test, and gives them a single location to live in the application.","Visual Studio can quickly analyze a project and show statistics for the classes and methods in the project. The maintainability index, cyclomatic complexity, and lines of code are all great metrics to pay attention to. The ideal maintainability index is 100, but don’t expect to hit that with any code that’s doing real work. However, you should certainly able to keep it above 50.\r\rDemo GildedRose.","Using Excel","I’m not a fan of regions. They mainly exist because at one time they were a reasonable means of hiding generated code, before we had support for partial classes and other language features to deal with this. The worst offense with regions is when they’re used within a method, like this:\r(click)\r\rThey’re also bad when used at the class level for “standard” formatting of code, making it impossible to actually see what the code does, like this:\r(click)\r\rCan someone tell me what this class does?\r(click)\r\rI have a whole article devoted to why using regions is a bad habit, anti-pattern, code smell, whatever you prefer. It includes some survey results on the most common ways people use them as well. (click)","Open-Closed Principle","Software can only be open to extension in a few different axes, and each additional bit of flexibility adds complexity to the software. Thus, this flexibility should be added only when needed, not simply anticipated.","What happens when we need to add another country?\rWhat happens when we must add another rule?\r\rHow can we refactor this so this method no longer needs to change?\r\r","Define a type to describe a rule. Move each rule into its own type. Create a collection of rules to apply and apply them.\r\rPass the set of rules into the IsSpecialCustomer() method’s class (or even the method itself).","Any time you find that you need to check the type of an object within a polymorphic block of code (such as a foreach), this is a sign that you are breaking LSP.","Nulls break polymorphism and violate LSP just as much as other subtypes that aren’t substitutable! Try to avoid the possibility of dealing with nulls in polymorphic code like foreach loops – consider using Null Object Pattern to address.","This is an extemely common example of the Repository design pattern. In fact, I use this exact pattern in quite a few production applications today. There’s nothing inherently wrong with this implementation on its own. However, sometimes it does violate ISP if you need to separate Commands from Queries","You can create small interfaces and compose the larger interfaces from the smaller ones if you control all of the code and you can’t simply do away with the larger interfaces. In this case, the separation of interfaces would allow us to do something like implement caching only on the read operations, and implement delayed writes using some kind of queue or message bus for the write operations.","“Legacy” N-Tier Logical Architecture","Hidden Dependencies","Extract interface\rImplement interface with tightly coupled original code\r","Mention Explicit Dependencies Principle","Water break","Get them excited."],"emailShareUrl":"mailto:?subject=Check out this SlideShare presentation\u0026body=https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420","extension":"pptx","facebookShareUrl":"https://facebook.com/sharer.php?u=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fimproving-the-design-of-existing-software-81246420%2F81246420\u0026t=Improving+the+Design+of+Existing+Software","genaiDescriptionCreatedAt":"2023-12-29","genaiTest":"description","id":"81246420","iframeEmbed":{"url":"https://www.slideshare.net/slideshow/embed_code/key/3FzNAJNnFsIa1v","height":486,"width":597},"isIndexable":true,"isLikedByCurrentUser":false,"isPrivate":false,"isSeoTitleTestVariant":true,"isViewable":true,"language":"en","likes":4,"linkedinShareUrl":"https://www.linkedin.com/cws/share?url=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fimproving-the-design-of-existing-software-81246420%2F81246420\u0026trk=SLIDESHARE","downloadCount":32,"recommendationsByLocation":{"rightRail":[{"algorithmId":"2","displayTitle":"Clean architecture with asp.net core by Ardalis","isSavedByCurrentUser":false,"pageCount":72,"score":0.7792,"slideshowId":"231758866","sourceName":"ss_similarity","strippedTitle":"clean-architecture-with-aspnet-core-by-ardalis","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/cleanarchitecturewithasp-200410145321-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Clean Architecture with ASP.NET Core\r\nASP.NET Core provides better support for clean, testable, maintainable architectures than any of its predecessors. Learn the underlying principles that apply to project/solution organization, how best to arrange your projects to support clean code, and how to refactor existing solutions toward this architecture. Examples will use ASP.NET Core but the principles covered apply to all languages and platforms.\r\n\r\nAbout Steve\r\nSteve Smith (@ardalis) is an entrepreneur and software developer with a passion for building quality software as effectively as possible. Steve has published several courses on Pluralsight, covering DDD, SOLID, design patterns, and software architecture. He’s a Microsoft ASP.NET MVP and Insider, a frequent speaker at developer conferences, an author, and a trainer. Steve works with companies that want to avoid the trap of technical debt by helping their teams deliver quality software, quickly. Steve and his team have been described by clients as a “force multiplier”, amplifying the value of existing development teams. Steve’s client list includes Microsoft, Quicken Loans, Celina Insurance, and many other satisfied customers.","tags":["asp.net core","clean architecture","clean code"],"url":"https://www.slideshare.net/slideshow/clean-architecture-with-aspnet-core-by-ardalis/231758866","userLogin":"ardalis","userName":"Steven Smith","viewCount":1993},{"algorithmId":"2","displayTitle":"Introducing domain driven design - dogfood con 2018","isSavedByCurrentUser":false,"pageCount":64,"score":0.7762,"slideshowId":"118348905","sourceName":"ss_similarity","strippedTitle":"introducing-domain-driven-design-dogfood-con-2018","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/introducingdomain-drivendesign-dogfoodcon2018-181005192911-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"DDD provides a set of patterns and practices for tackling complex business problems with software models. Learn the basics of DDD in this session, including several principles and patterns you can start using immediately even if your project hasn't otherwise embraced DDD. Examples will primarily use C#/.NET.","tags":["ddd","domain-driven design","design patterns"],"url":"https://www.slideshare.net/slideshow/introducing-domain-driven-design-dogfood-con-2018/118348905","userLogin":"ardalis","userName":"Steven Smith","viewCount":1498},{"algorithmId":"2","displayTitle":"Most Useful Design Patterns","isSavedByCurrentUser":false,"pageCount":77,"score":0.7237,"slideshowId":"86181943","sourceName":"ss_similarity","strippedTitle":"most-useful-design-patterns","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/mostusefuldesignpatterns-180115172000-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Design patterns provide common templates for solving similar problems. They also provide a higher-level language for software developers to use to describe approaches they might choose when designing part of an application. This session introduces and applies several patterns useful to web application developers. Examples will primarily use C#/.NET.","tags":["design patterns","solid principles","software development"],"url":"https://www.slideshare.net/slideshow/most-useful-design-patterns/86181943","userLogin":"ardalis","userName":"Steven Smith","viewCount":7485},{"algorithmId":"2","displayTitle":"Design Pattern Mastery - Momentum Dev Con 19 Apr 2018","isSavedByCurrentUser":false,"pageCount":59,"score":0.6798,"slideshowId":"94464051","sourceName":"ss_similarity","strippedTitle":"design-pattern-mastery-momentum-dev-con-19-apr-2018","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/designpatternmastery-180420122251-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Design patterns help developers and teams solve problems using proven approaches. In this talk, you'll learn how to solve a series of real world problems by applying patterns. Not only do patterns help individual developers solve particular problems, but they also enable teams to discuss design decisions using a richer, more descriptive language. By the end, you'll have some concrete tools you can apply, and hopefully the desire to master more patterns as you continue to improve!\r\n","tags":["design patterns","software development","software architecture"],"url":"https://www.slideshare.net/slideshow/design-pattern-mastery-momentum-dev-con-19-apr-2018/94464051","userLogin":"ardalis","userName":"Steven Smith","viewCount":2016},{"algorithmId":"2","displayTitle":"Breaking Dependencies to Allow Unit Testing - DevIntersection Spring 2016","isSavedByCurrentUser":false,"pageCount":59,"score":0.4745,"slideshowId":"61235631","sourceName":"ss_similarity","strippedTitle":"breaking-dependencies-to-allow-unit-testing-61235631","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/breakingdependenciestoallowunittesting-160422124740-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Unit testing software can be difficult, especially when the software wasn't designed to be testable. Dependencies on infrastructure concerns and software we don't control are one of the biggest contributors to testing difficulty. In this session, you'll learn the difference between unit tests and other kinds of tests, how to recognize and invert dependencies, and how to unit test your code's interactions with these dependencies without testing the infrastructure itself.\r\n","tags":["deviq","refactoring","quality"],"url":"https://www.slideshare.net/slideshow/breaking-dependencies-to-allow-unit-testing-61235631/61235631","userLogin":"ardalis","userName":"Steven Smith","viewCount":1423},{"algorithmId":"2","displayTitle":"Improving the Quality of Existing Software","isSavedByCurrentUser":false,"pageCount":78,"score":0.4107,"slideshowId":"61995444","sourceName":"ss_similarity","strippedTitle":"improving-the-quality-of-existing-software-61995444","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/improvingthequalityofexistingsoftware-160513174752-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses techniques for improving the quality of existing software, including reducing technical debt, following principles like DRY and SOLID, using characterization tests to preserve behavior during refactoring, and improving skills to write higher quality code faster. It covers topics like refactoring, test-driven development, dependency inversion, and design patterns. The goal is to maintain and enhance application code quality over time through refactoring and preventing technical debt.","tags":["software quality","quality","software"],"url":"https://www.slideshare.net/slideshow/improving-the-quality-of-existing-software-61995444/61995444","userLogin":"ardalis","userName":"Steven Smith","viewCount":536},{"algorithmId":"2","displayTitle":"Improving the Quality of Existing Software","isSavedByCurrentUser":false,"pageCount":75,"score":0.3987,"slideshowId":"54532107","sourceName":"ss_similarity","strippedTitle":"improving-the-quality-of-existing-software-54532107","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/improvingthequalityofexistingsoftware-151029161146-lva1-app6892-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"How do you improve the quality of your existing software, while continuing to add value for your customers? What are some heuristics and code smells you can look for, and principles and patterns you can use to guide you, as you make your software better over time instead of worse?","tags":["tdd","object oriented programming","software craftsmanship"],"url":"https://www.slideshare.net/slideshow/improving-the-quality-of-existing-software-54532107/54532107","userLogin":"ardalis","userName":"Steven Smith","viewCount":1697},{"algorithmId":"2","displayTitle":"Breaking Dependencies to Allow Unit Testing","isSavedByCurrentUser":false,"pageCount":53,"score":0.3948,"slideshowId":"54545821","sourceName":"ss_similarity","strippedTitle":"breaking-dependencies-to-allow-unit-testing","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/breakingdependenciestoallowunittesting-151029224324-lva1-app6892-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Unit testing software can be difficult, especially when the software wasn't designed to be testable. Dependencies on infrastructure concerns and software we don't control are one of the biggest contributors to testing difficulty. In this session, you'll learn the difference between unit tests and other kinds of tests, how to recognize and invert dependencies, and how to unit test your code's interactions with these dependencies without testing the infrastructure itself.","tags":["unit testing","refactoring","solid"],"url":"https://www.slideshare.net/slideshow/breaking-dependencies-to-allow-unit-testing/54545821","userLogin":"ardalis","userName":"Steven Smith","viewCount":1411}],"whatsHot":[{"algorithmId":"2","displayTitle":"Improving the Quality of Existing Software - DevIntersection April 2016","isSavedByCurrentUser":false,"pageCount":78,"score":0.3911,"slideshowId":"61235498","sourceName":"ss_similarity","strippedTitle":"improving-the-quality-of-existing-software-devintersection-april-2016","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/improvingthequalityofexistingsoftware-160422124424-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"How do you improve the quality of your existing software, while continuing to add value for your customers? What are some heuristics and code smells you can look for, and principles and patterns you can use to guide you, as you make your software better over time instead of worse? How can we improve our skills and techniques so that writing high quality software becomes our default, fastest way of working?\r\n","tags":["deviq","refactoring","solid principles"],"url":"https://www.slideshare.net/slideshow/improving-the-quality-of-existing-software-devintersection-april-2016/61235498","userLogin":"ardalis","userName":"Steven Smith","viewCount":1308},{"algorithmId":"2","displayTitle":"Refactoring with SOLID - Telerik India DevCon 2013","isSavedByCurrentUser":false,"pageCount":56,"score":0.3609,"slideshowId":"15960433","sourceName":"ss_similarity","strippedTitle":"refactoring-with-solid-telerik-india-devcon-2013","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/refactoringwithsolid-130112041155-phpapp01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses refactoring applications using SOLID principles. It covers how software can deteriorate over time through duplication, excess coupling, quick fixes, and hacks. It advocates using preventative maintenance through refactoring to eliminate duplication and simplify design, as well as automated tests to verify correctness and avoid regressions. The document outlines the refactoring process and introduces characterization tests. It then covers each SOLID principle - Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, and Dependency Inversion - and provides examples of how to apply them through various refactorings.","tags":["solid principles","refactoring"],"url":"https://www.slideshare.net/slideshow/refactoring-with-solid-telerik-india-devcon-2013/15960433","userLogin":"ardalis","userName":"Steven Smith","viewCount":1392},{"algorithmId":"2","displayTitle":"Common ASP.NET Design Patterns - Telerik India DevCon 2013","isSavedByCurrentUser":false,"pageCount":44,"score":0.3467,"slideshowId":"15960487","sourceName":"ss_similarity","strippedTitle":"common-aspnet-design-patterns","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/commonasp-netdesignpatterns-130112041913-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document provides an overview of common ASP.NET design patterns, including Singleton, Strategy, Repository, Proxy, Command, and Factory patterns. It discusses the intent, structure, and usage of each pattern. Code examples and references are also provided. Real-world examples are discussed to demonstrate how design patterns can be used to address issues like tight coupling and improve code quality during refactoring or initial design.","tags":["design patterns"],"url":"https://www.slideshare.net/slideshow/common-aspnet-design-patterns/15960487","userLogin":"ardalis","userName":"Steven Smith","viewCount":10236},{"algorithmId":"2","displayTitle":"Scaling Indexing and Replication in Jira Data Center Apps","isSavedByCurrentUser":false,"pageCount":67,"score":0.342,"slideshowId":"173159116","sourceName":"ss_similarity","strippedTitle":"scaling-indexing-and-replication-in-jira-data-center-apps","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/1650-1730advancedyakovlev-andriy-190917234525-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Building an app that scales well for Jira Data Center can be challenging, especially with regards to index replication.\r\n\r\nAndriy Yakovlev, a Principal Premier Support Engineer at Atlassian will share some common problems customers have experienced with apps on large instances, and how to prevent them.\r\n\r\nAttendees will learn about how indexing works in Jira, and how indexes are replicated in Jira Data Center, as well as what to look out for to prevent problems before they happen.","tags":["atlassian","atlascamp 2019"],"url":"https://www.slideshare.net/slideshow/scaling-indexing-and-replication-in-jira-data-center-apps/173159116","userLogin":"GoAtlassian","userName":"Atlassian","viewCount":15942},{"algorithmId":"2","displayTitle":"Sling Component Filters in CQ5 ","isSavedByCurrentUser":false,"pageCount":23,"score":0.3417,"slideshowId":"23451158","sourceName":"ss_similarity","strippedTitle":"prsentation-dominik-suess","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/prsentationdominiksuess-130625035417-phpapp01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Presentation “Sling Component Filters in CQ5“ by Dominik Süss at CQCON2013 in Basel on 19 and 20 June 2013.","tags":["cqcon2013","cq conference","dominik süss"],"url":"https://www.slideshare.net/slideshow/prsentation-dominik-suess/23451158","userLogin":"connectwebex","userName":"connectwebex","viewCount":11650},{"algorithmId":"2","displayTitle":"Take Full Advantage of the Oracle PL/SQL Compiler","isSavedByCurrentUser":false,"pageCount":27,"score":0.3409,"slideshowId":"66773445","sourceName":"ss_similarity","strippedTitle":"take-full-advantage-of-the-oracle-plsql-compiler","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/takefulladvantageofplsqlcompiler-161005162934-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The Oracle PL/SQL compiler does much more than compile code. It also automatically optimizes code, supports conditional compilation, and compile-time warning (lint checking).","tags":["oracle database","plsql","compiler"],"url":"https://www.slideshare.net/slideshow/take-full-advantage-of-the-oracle-plsql-compiler/66773445","userLogin":"StevenFeuerstein","userName":"Steven Feuerstein","viewCount":944},{"algorithmId":"2","displayTitle":"Arquillian \u0026 Citrus","isSavedByCurrentUser":false,"pageCount":47,"score":0.3353,"slideshowId":"59355968","sourceName":"ss_similarity","strippedTitle":"arquillian-citrus","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/arquilliancitrus-160310064032-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Arquillian is a Java testing framework that allows running integration tests inside a container. It manages the container lifecycle and allows deploying test archives and accessing managed resources from tests. Citrus is a complementary framework for testing messaging interfaces like REST, SOAP, and JMS. It provides components to simulate clients and servers for messaging protocols. Together, Arquillian and Citrus allow testing applications by deploying them in a container and interacting with services through simulated messaging.","tags":["integration testing","java","testing"],"url":"https://www.slideshare.net/slideshow/arquillian-citrus/59355968","userLogin":"christophd","userName":"christophd","viewCount":1912},{"algorithmId":"2","displayTitle":"An introduction to unit testing","isSavedByCurrentUser":false,"pageCount":45,"score":0.3326,"slideshowId":"119752232","sourceName":"ss_similarity","strippedTitle":"an-introduction-to-unit-testing-119752232","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/1801-unit-testing-intro-170210034449-181017141931-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses introductory concepts and best practices for unit testing, including:\n1. Why unit tests are important for reducing bugs, improving design, and making development faster. \n2. The different types of tests like unit tests, integration tests, and functional tests.\n3. What constitutes a unit test, including that it is small, repeatable, consistent, and fast.\n4. An example of writing a \"Hello World\" unit test in C#.","tags":[],"url":"https://www.slideshare.net/slideshow/an-introduction-to-unit-testing-119752232/119752232","userLogin":"adamstephensen","userName":"Adam Stephensen","viewCount":601},{"algorithmId":"2","displayTitle":"Java Concurrent","isSavedByCurrentUser":false,"pageCount":10,"score":0.3314,"slideshowId":"66285407","sourceName":"ss_similarity","strippedTitle":"java-concurrent","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/concurrent-160922044926-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Concurrency is the ability to run several programs or several parts of a program in parallel. If a time consuming task can be performed asynchronously or in parallel, this improve the throughput and the interactivity of the program.","tags":["concurrency","thread","java"],"url":"https://www.slideshare.net/slideshow/java-concurrent/66285407","userLogin":"NexThoughts","userName":"NexThoughts Technologies","viewCount":268},{"algorithmId":"2","displayTitle":"Spring Boot Intro","isSavedByCurrentUser":false,"pageCount":13,"score":0.3207,"slideshowId":"66746878","sourceName":"ss_similarity","strippedTitle":"spring-boot-intro","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/springbootintro-161005035620-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document introduces Spring Boot, a framework for building cloud native applications. It discusses how Spring Boot makes it easy to create stand-alone, production-grade Spring based applications that you can \"just run\". It also covers cloud native principles and deploying Spring Boot applications to Cloud Foundry. The presenter's background and references for further information are provided.","tags":["springboot"],"url":"https://www.slideshare.net/slideshow/spring-boot-intro/66746878","userLogin":"albertoaflores","userName":"Alberto Flores","viewCount":443},{"algorithmId":"2","displayTitle":"Unit Testing Oracle PL/SQL Code: utPLSQL, Excel and More","isSavedByCurrentUser":false,"pageCount":21,"score":0.3202,"slideshowId":"76372571","sourceName":"ss_similarity","strippedTitle":"unit-testing-oracle-plsql-code-utplsql-excel-and-more","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/codetalk-2017-05-unit-testing-plsql-170526110807-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses unit testing and regression testing for PL/SQL. It introduces three developers - Jacek Gabal, Pavel Kaplya, and Stefan Poschenrieder - who advocate for and actively practice unit testing. They discuss why unit and regression testing are important, tools for testing PL/SQL like utPLSQL, and how Stefan has used Excel as a testing harness for utPLSQL. The document also summarizes new features of utPLSQL version 3.","tags":["oracle","oracle database","plsql"],"url":"https://www.slideshare.net/slideshow/unit-testing-oracle-plsql-code-utplsql-excel-and-more/76372571","userLogin":"StevenFeuerstein","userName":"Steven Feuerstein","viewCount":1660},{"algorithmId":"2","displayTitle":"06 integrating extra features and looking forward","isSavedByCurrentUser":false,"pageCount":20,"score":0.3188,"slideshowId":"52422183","sourceName":"ss_similarity","strippedTitle":"06-integrating-extra-features-and-looking-forward","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/06-integratingextrafeaturesandlookingforward-150904131938-lva1-app6892-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses various topics related to integrating extra features into Entity Framework, including stored procedures, concurrency detection, best practices, and new features in Entity Framework 7. Stored procedures can provide a single point of access control and help limit dynamic SQL queries. Concurrency conflicts can be detected by adding a timestamp property to entities. Best practices include using Include to eager load related data and disposing of database contexts properly. Entity Framework 7 brings performance improvements and support for additional platforms and data stores.","tags":[],"url":"https://www.slideshare.net/slideshow/06-integrating-extra-features-and-looking-forward/52422183","userLogin":"ssuser0b9018","userName":"Марина Босова","viewCount":6900},{"algorithmId":"2","displayTitle":"Background processing with hangfire","isSavedByCurrentUser":false,"pageCount":24,"score":0.3166,"slideshowId":"80085296","sourceName":"ss_similarity","strippedTitle":"background-processing-with-hangfire","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/backgroundprocessingwithhangfire-170923154352-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Hangfire\r\nAn easy way to perform background processing in .NET and .NET Core applications. No Windows Service or separate process required.\r\n\r\nWhy Background Processing?\r\nLengthy operations like updating lot of records in DB\r\nChecking every 2 hours for new data or files\r\nInvoice generation at the end of every billing period\r\nMonthly Reporting\r\nRebuild data, indexes or search-optimized index after data change\r\nAutomatic subscription renewal\r\nRegular Mailings\r\nSend an email due to an action\r\nBackground service provisioning","tags":["programming","c#","hangfire"],"url":"https://www.slideshare.net/slideshow/background-processing-with-hangfire/80085296","userLogin":"AleksandarBozinovski","userName":"Aleksandar Bozinovski","viewCount":1673},{"algorithmId":"2","displayTitle":"Spring AOP","isSavedByCurrentUser":false,"pageCount":50,"score":0.3156,"slideshowId":"38218349","sourceName":"ss_similarity","strippedTitle":"spring-aop-38218349","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/springaop-140821095341-phpapp01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Spring AOP is presented to solve the problem of cross-cutting concerns. Core concepts include join points, pointcuts, advice, and aspects. Pointcuts define where advice executes, such as methods matching a signature. Advice includes before, after returning, after throwing and around advice. Aspects modularize concerns using pointcuts and advice. Spring AOP uses proxies to weave aspects at runtime.","tags":["spring"],"url":"https://www.slideshare.net/shakil_akhtar/spring-aop-38218349","userLogin":"shakil_akhtar","userName":"SHAKIL AKHTAR","viewCount":1324},{"algorithmId":"2","displayTitle":"Getting Reactive with Spring Framework 5.0’s GA release","isSavedByCurrentUser":false,"pageCount":11,"score":0.308,"slideshowId":"81166141","sourceName":"ss_similarity","strippedTitle":"getting-reactive-with-spring-framework-50s-ga-release","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/spr50launchwebinar-171024211905-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses the new features of Spring Framework 5.0 including fully reactive web functionality through WebFlux, native Kotlin extensions, JDK 9 support, and integration with Java EE 8 APIs. It introduces Project Reactor and how it allows non-blocking and asynchronous code. It compares the traditional Spring MVC servlet stack to the new reactive stack in Spring WebFlux. It also briefly discusses functional programming models in Kotlin and Spring MVC.","tags":["spring framework 5.0","java 8+","reactive"],"url":"https://www.slideshare.net/slideshow/getting-reactive-with-spring-framework-50s-ga-release/81166141","userLogin":"Pivotal","userName":"VMware Tanzu","viewCount":1385},{"algorithmId":"2","displayTitle":"Spring boot 3g","isSavedByCurrentUser":false,"pageCount":26,"score":0.3064,"slideshowId":"35844882","sourceName":"ss_similarity","strippedTitle":"spring-boot-3g","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/springboot-3g-140613115403-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document summarizes a presentation about SpringBoot, a framework for creating Spring applications. It discusses how SpringBoot uses Groovy and removes the need for XML configuration. It provides an overview of Texas NIC where the presenter works and some of their applications. It then discusses why SpringBoot was created, how it can be used with Groovy, and demonstrates some sample applications. It also covers some good aspects of SpringBoot, things that can be confusing, and unexpected behaviors. It concludes with some tips for using SpringBoot with IntelliJ IDEA.","tags":[],"url":"https://www.slideshare.net/slideshow/spring-boot-3g/35844882","userLogin":"vasya10","userName":"vasya10","viewCount":2719},{"algorithmId":"2","displayTitle":"Test Policy and Practices","isSavedByCurrentUser":false,"pageCount":36,"score":0.3043,"slideshowId":"235197408","sourceName":"ss_similarity","strippedTitle":"test-policy-and-practices","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/testingpracticesandpolicy-2-200608123000-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This presentation includes challenges in testing, levels of testing, best practices and policies, Test Drive Design(TDD), \r\nBehavioral Driven Design (BDD Testing), TDD v/s BDD\r\n","tags":[],"url":"https://www.slideshare.net/slideshow/test-policy-and-practices/235197408","userLogin":"talentica","userName":"Talentica Software","viewCount":125},{"algorithmId":"2","displayTitle":"FAST for SharePoint Deep Dive","isSavedByCurrentUser":false,"pageCount":26,"score":0.3026,"slideshowId":"7625033","sourceName":"ss_similarity","strippedTitle":"avanade-fast-for-sharepoint-deep-dive","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/avanadespeakerslot-bpc-110414045347-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"A brief look at a customer case study followed by a series of 3 demos, wrapping up with a discussion on FAST for SharePoint infrastructure.","tags":["sharepoint 2010","fs4sp","fast"],"url":"https://www.slideshare.net/slideshow/avanade-fast-for-sharepoint-deep-dive/7625033","userLogin":"neil_richards","userName":"neil_richards","viewCount":4750},{"algorithmId":"2","displayTitle":"Microsoft Fakes, Unit Testing the (almost) Untestable Code","isSavedByCurrentUser":false,"pageCount":26,"score":0.3002,"slideshowId":"57722680","sourceName":"ss_similarity","strippedTitle":"microsoft-fakes-unit-testing-the-almost-untestable-code","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/msfakesunittestingv2-160201084501-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Microsoft Fakes help you isolate the code you are testing by replacing other parts of the application with substitute code. These substitutes are called stubs and shims and are under the control of your tests. Microsoft Fakes is ideal when you need to test legacy or “legacy” code that is either restricted for refactoring or “refactoring” practically means rewriting and cost you a lot.","tags":[".net","unit testing","microsoft fakes"],"url":"https://www.slideshare.net/slideshow/microsoft-fakes-unit-testing-the-almost-untestable-code/57722680","userLogin":"jus386","userName":"Aleksandar Bozinovski","viewCount":518},{"algorithmId":"2","displayTitle":"Polaris presentation ioc - code conference","isSavedByCurrentUser":false,"pageCount":46,"score":0.2996,"slideshowId":"97357455","sourceName":"ss_similarity","strippedTitle":"polaris-presentation-ioc-code-conference-97357455","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/polarispresentation-ioc-codeconference-180517020146-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses an introduction to dependency injection (DI) and inversion of control (IOC) using a console application example in C#. It will progressively introduce these concepts through examples, exploring how to transform a simple program into a more complex one while applying DI and IOC. The learning objectives are to understand what DI and IOC are, whether they are always used together, and see how they work in a simple scenario. Examples will be provided on GitHub and various DI containers like StructureMap and Autofac may be explored.","tags":[],"url":"https://www.slideshare.net/slideshow/polaris-presentation-ioc-code-conference-97357455/97357455","userLogin":"StevenContos","userName":"Steven Contos","viewCount":102}],"alsoLiked":[],"similarTo":[{"algorithmId":"3","displayTitle":"Improving the Quality of Existing Software","isSavedByCurrentUser":false,"pageCount":76,"score":0.7702,"slideshowId":"66819350","sourceName":"cm_text","strippedTitle":"improving-the-quality-of-existing-software-66819350","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/improvingthequalityofexistingsoftware-161006172037-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Given at DogFoodCon 2016 in Columbus, Ohio\r\nAs developers, most of our time is spent working on existing software – even if it’s just the software we wrote ourselves, yesterday. And over time, software rots. If were not diligent, our beautiful code can degrade into a worthless mess. Keeping our code in working condition is no different than changing the oil in our car “ its preventive maintenance. In this session, Steve will cover some common places to look for signs of degradation in existing applications, and describe the steps we can take to improve our code. Examples will use C# and primarily ASP.NET.","tags":["clean code","software development","refactoring"],"url":"https://www.slideshare.net/slideshow/improving-the-quality-of-existing-software-66819350/66819350","userLogin":"ardalis","userName":"Steven Smith","viewCount":1334},{"algorithmId":"3","displayTitle":"Improving The Quality of Existing Software","isSavedByCurrentUser":false,"pageCount":67,"score":0.7329,"slideshowId":"27061490","sourceName":"cm_text","strippedTitle":"improving-the-quality-of-existing-software","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/improvingthequalityofexistingsoftware-131010085426-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Presented at DevReach 2013.\r\n\r\nAs developers, most of our time is spent working on existing software. Sure, occasionally we get the chance to fire up a new Solution in Visual Studio, and that can be exciting. But after the first day, we find ourselves once more having to deal with the work we did yesterday. And today, we know more than we did yesterday, so there are things we’d do differently, if we had it to do over.\r\nOver time, software rots. If we’re not diligent, our beautiful code can degrade into a worthless mess. Keeping our code in working condition is no different than changing the oil in our car – it’s preventive maintenance. In this session, Steve will look at some common places to look for signs of degradation in existing applications, and steps to take to improve the code. Examples will use C# and primarily ASP.NET.","tags":["agile so","solid principles","refactoring"],"url":"https://www.slideshare.net/slideshow/improving-the-quality-of-existing-software/27061490","userLogin":"ardalis","userName":"Steven Smith","viewCount":2946},{"algorithmId":"3","displayTitle":"Refactoring Applications using SOLID Principles","isSavedByCurrentUser":false,"pageCount":56,"score":0.6147,"slideshowId":"14624444","sourceName":"cm_text","strippedTitle":"refactoring-applications-using-solid-principles","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/refactoringwithsoliddevreach2012-121007122059-phpapp01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":" We’ve all heard about well-designed software projects, where things aren’t (yet) a big ball of mud that’s painful to work with, but many of us aren’t lucky enough to work on these. Nor is it an option for us to get to start a brand new “greenfield” project, where we can leave behind the legacy of spaghetti code and technical debt our current project might have.\r\n\r\n \r\nBut there is hope! By applying refactoring steps based on SOLID principles of object oriented design, we can reduce the technical debt of our existing application, improve our code quality, and hopefully make our application more enjoyable and productive to work with.\r\n\r\n \r\nIn this session, we’ll briefly introduce the SOLID principles and several design patterns, and then we’ll apply these principles and patterns by improving the design of an existing application through several refactoring steps. ","tags":["c#","solid principles","software development"],"url":"https://www.slideshare.net/slideshow/refactoring-applications-using-solid-principles/14624444","userLogin":"ardalis","userName":"Steven Smith","viewCount":10533},{"algorithmId":"3","displayTitle":"Integration strategies best practices- Mulesoft meetup April 2018","isSavedByCurrentUser":false,"pageCount":28,"score":0.5801,"slideshowId":"125828661","sourceName":"cm_text","strippedTitle":"integration-strategies-best-practices-mulesoft-meetup-april-2018","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/integrationstrategies-bestpractices-meetup-181213174536-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses best practices for integration strategies including using an integration platform, designing integrations, and implementing resiliency patterns. It recommends having an integration platform to provide features like batch processing, loose coupling, reuse, governance, and security. When designing integrations, questions about data, users, transactions, orchestrations, and future needs should be considered. Common resiliency patterns discussed are timeouts, circuit breakers, bulkheads, retries, and idempotency.","tags":["apis","integration patterns","bulkheads"],"url":"https://www.slideshare.net/slideshow/integration-strategies-best-practices-mulesoft-meetup-april-2018/125828661","userLogin":"RohanRasane","userName":"Rohan Rasane","viewCount":220},{"algorithmId":"3","displayTitle":"STAQ Development Manual (Redacted)","isSavedByCurrentUser":false,"pageCount":62,"score":0.5783,"slideshowId":"53118717","sourceName":"cm_text","strippedTitle":"staq-development-manual-redacted","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/redactedstaqdevmanual-150923164137-lva1-app6892-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This deck represents our current thinking about the best way to build enterprise SaaS software in 2015 - using a variety of techniques from several disciplines. \r\n\r\nSince I wrote this I have also become very interested in resilience engineering and the notion that web developers are primarily engaged in the construction of socio-technical systems. When I rewrite this I plan to talk about how we should try to minimize mean-time-to-recover (MTTR) instead of mean-time-between-failures (MTBF), and how continuous deployment grows a safety culture around your operations.\r\n\r\nI redacted most of the examples that illustrate these points because they use sensitive code examples or URLs. If you want to see the rest of slides, join us!\r\n","tags":["staq","enterprise","saas"],"url":"https://www.slideshare.net/slideshow/staq-development-manual-redacted/53118717","userLogin":"subelsky","userName":"Mike Subelsky","viewCount":5663},{"algorithmId":"3","displayTitle":"Dev ops concept","isSavedByCurrentUser":false,"pageCount":25,"score":0.5753,"slideshowId":"95474964","sourceName":"cm_text","strippedTitle":"dev-ops-concept-95474964","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/editeddevops101-150408181346-conversion-gate01-180430093006-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"DevOps is the combination of cultural philosophies, practices, and tools that increases an organization's ability to deliver applications and services at high velocity: evolving and improving products at a faster pace than organizations using traditional software development and infrastructure management processes.","tags":["devops","devops course","devops online training"],"url":"https://www.slideshare.net/slideshow/dev-ops-concept-95474964/95474964","userLogin":"Professional-Guru","userName":"Professional Guru","viewCount":101},{"algorithmId":"3","displayTitle":"Object-oriented design principles","isSavedByCurrentUser":false,"pageCount":33,"score":0.5668,"slideshowId":"34715923","sourceName":"cm_text","strippedTitle":"oo-design-principles-34715923","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/oodesignprinciplesslideshare-140515053613-phpapp01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses object oriented design principles. It begins with an introduction and agenda. It then covers several object oriented design principles including the open-closed principle, single responsibility principle, interface segregation principle, Liskov substitution principle, and dependency inversion principle. Examples are provided for each. It also discusses bad designs, anti-patterns, and some \"evil stuff\" to avoid like singletons. The document concludes with a review of key principles like encapsulation, composition over inheritance, programming to interfaces, and loose coupling.","tags":["ood","object-oriented programming","design"],"url":"https://www.slideshare.net/slideshow/oo-design-principles-34715923/34715923","userLogin":"XiaoyanChen3","userName":"Xiaoyan Chen","viewCount":1924},{"algorithmId":"3","displayTitle":"Cloud and Network Transformation using DevOps methodology : Cisco Live 2015","isSavedByCurrentUser":false,"pageCount":28,"score":0.5646,"slideshowId":"49363983","sourceName":"cm_text","strippedTitle":"cisco-live2015-ccscld2865","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/ciscolive2015-ccscld-2865-150614063736-lva1-app6892-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Content presented as part of Cisco Live 2015 in San Diego\r\n\r\nWhy DevOps and what it means to be a DevOps-Enabled Organization?\r\n\r\nRecommendations on Toolchain, Metrics framework, best practices and tips to help you embark on your IT Organization on DevOps journey","tags":["metrics","cloud transformation","toolchain"],"url":"https://www.slideshare.net/slideshow/cisco-live2015-ccscld2865/49363983","userLogin":"vimalnsuba","userName":"Vimal Suba","viewCount":2659},{"algorithmId":"3","displayTitle":"Entity Framework: To the Unit of Work Design Pattern and Beyond","isSavedByCurrentUser":false,"pageCount":34,"score":0.563,"slideshowId":"89068729","sourceName":"cm_text","strippedTitle":"entity-framework-to-the-unit-of-work-design-pattern-and-beyond","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/uowdesignpattern-180227111156-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses issues with traditional ASP.NET application architectures and how the introduction of MVC helped address some problems. It then describes how the presenter implemented the Unit of Work pattern to help with testing and database consistency in their application. However, this implementation violated SOLID principles. The presenter improved the design by separating concerns into distinct layers and implementing generic repositories. This made the code more testable and decoupled from Entity Framework while better adhering to object-oriented design principles. In the end, the presenter advocates evaluating design patterns critically and continuously challenging accepted approaches.","tags":[".net","programming","coding"],"url":"https://www.slideshare.net/SteveWestgarth/entity-framework-to-the-unit-of-work-design-pattern-and-beyond","userLogin":"SteveWestgarth","userName":"Steve Westgarth","viewCount":214},{"algorithmId":"3","displayTitle":"Change Management in Hybrid landscapes 2017","isSavedByCurrentUser":false,"pageCount":28,"score":0.5618,"slideshowId":"80898911","sourceName":"cm_text","strippedTitle":"change-management-in-hybrid-landscapes-2017","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/2017hftchangemanagementinhybridfinal-171017133338-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Updated deck presented at Mastering SAP in Melbourne running through Change management in heterogeneous landscapes","tags":["sap","sap mentors","change management"],"url":"https://www.slideshare.net/slideshow/change-management-in-hybrid-landscapes-2017/80898911","userLogin":"BoobBoo","userName":"Chris Kernaghan","viewCount":372},{"algorithmId":"3","displayTitle":"CNUG TDD June 2014","isSavedByCurrentUser":false,"pageCount":30,"score":0.5605,"slideshowId":"55304410","sourceName":"cm_text","strippedTitle":"cnug-tdd-june-2014","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/slides-cnugtddjune182014-151119171930-lva1-app6891-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Test-Driven Development (TDD) is a software development process that relies on writing automated tests before developing code to pass those tests (\"red-green-refactor\"). TDD promotes writing isolated, repeatable unit tests and decoupling code from external dependencies through techniques like dependency injection and mocking. While TDD has benefits like ensuring quality and preventing regressions, it has also received criticism for potentially leading to over-testing and an over-reliance on mocking. The presentation concludes with an open discussion of experiences and opinions on TDD.","tags":["cnug","tdd"],"url":"https://www.slideshare.net/slideshow/cnug-tdd-june-2014/55304410","userLogin":"srivastavamayank","userName":"Mayank Srivastava","viewCount":179},{"algorithmId":"3","displayTitle":"Patterns and practices for building enterprise-scale HTML5 apps","isSavedByCurrentUser":false,"pageCount":81,"score":0.5598,"slideshowId":"46230663","sourceName":"cm_text","strippedTitle":"patterns-and-practices-for-building-enterprisescale-html5-apps","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/html5-enterprise-scale-devweek-2015-150324122737-conversion-gate01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Developing large apps is difficult. Ensuring that code is consistent, maintainable, testable and has an architecture that enables change is essential. As is ensuring that multiple developers – across multiple teams – can efficiently contribute to the same application. When it comes to large server-focused apps, solutions to some of these challenges have been tried and tested. But, how do you achieve this when building HTML5 single-page apps?\r\n\r\nIn this session, Phil will cover the experiences his team have had when building HTML5 apps consisting of more than 250k lines of JavaScript (plus HTML templates, CSS, image, config etc) that are contributed to by multiple teams across multiple companies. He will highlight signs to watch out for as your HTML5 SPA grows, and a set of patterns and practices that help you avoid problems. He will also explain the simple yet powerful application architecture that their HTML5 apps have that is core to ensuring they scale.\r\n\r\nFinally, Phil will demonstrate how tooling can be used to support these patterns and practices, and enable a productive developer workflow where the first line of code is feature code, features can be developed and tested in isolation, code conflicts are avoided by grouping assets by feature, and features are composed into apps.","tags":["developer tooling","devweek","software engineering"],"url":"https://www.slideshare.net/slideshow/patterns-and-practices-for-building-enterprisescale-html5-apps/46230663","userLogin":"leggetter","userName":"Phil Leggetter","viewCount":961},{"algorithmId":"3","displayTitle":"Mvc","isSavedByCurrentUser":false,"pageCount":12,"score":0.557,"slideshowId":"10323083","sourceName":"cm_text","strippedTitle":"mvc-10323083","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/mvc-111125065348-phpapp01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document provides an overview of clean coding principles and design patterns, including the Model-View-Controller pattern. It discusses encapsulating data and functions, the single responsibility principle, DRY principle, favoring composition over inheritance, using interfaces, design patterns, and programming for the future rather than just the present. It also describes traditional and mediated MVC patterns, with the controller acting as a mediator between the view and model.","tags":[],"url":"https://www.slideshare.net/slideshow/mvc-10323083/10323083","userLogin":"creynders","userName":"creynders","viewCount":425},{"algorithmId":"3","displayTitle":"Lucas Gravley - HP - Self-Healing And Monitoring in a DevOps world","isSavedByCurrentUser":false,"pageCount":17,"score":0.5543,"slideshowId":"54657356","sourceName":"cm_text","strippedTitle":"lucas-gravley-hp-selfhealing-and-monitoring-in-a-devops-world","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/lucasgravley-hp-chatopsandmonitoring-3-151102190256-lva1-app6892-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Managing one or two unique machines in an ad-hoc manner is not a story that many people talk about nowadays. Today, small teams need to manage hundreds or thousands of nodes, serving a myriad of purposes, running any number of critical Dev and Ops workloads. And they have to do it in a way that still leaves time for unplanned and strategic work.\r\n\r\nLearn how HP ties DevOps automation, monitoring information and ChatOps collaboration together to eliminate manual, error-prone work and keep critical services running\r\n","tags":["it automation","devops","chatops"],"url":"https://www.slideshare.net/slideshow/lucas-gravley-hp-selfhealing-and-monitoring-in-a-devops-world/54657356","userLogin":"DOESsummit15","userName":"DevOps Enterprise Summit","viewCount":877},{"algorithmId":"3","displayTitle":"Start with passing tests (tdd for bugs) v0.5 (22 sep 2016)","isSavedByCurrentUser":false,"pageCount":53,"score":0.5533,"slideshowId":"66314260","sourceName":"cm_text","strippedTitle":"start-with-passing-tests-tdd-for-bugs-v05-22-sep-2016","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/startwithpassingteststddforbugsv0-160922180811-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"\"Turning TDD upside down - For bugs, always start with a passing test\" - Common workflow on TDD is to write failed tests. The problem with this approach is that it only works for a very specific scenario (when fixing bugs). This presentation will present a different workflow which will make the coding and testing of those tests much easier, faster, simpler, secure and thorough' \r\n\r\nPresented at LSCC (London Software Craftsmanship Community) http://www.meetup.com/london-software-craftsmanship on sep 2016.\r\n\r\n","tags":["tdd","appsec","testing"],"url":"https://www.slideshare.net/slideshow/start-with-passing-tests-tdd-for-bugs-v05-22-sep-2016/66314260","userLogin":"DinisCruz","userName":"Dinis Cruz","viewCount":1502},{"algorithmId":"3","displayTitle":"All you need is fast feedback loop, fast feedback loop, fast feedback loop is...","isSavedByCurrentUser":false,"pageCount":61,"score":0.5533,"slideshowId":"272172280","sourceName":"cm_text","strippedTitle":"all-you-need-is-fast-feedback-loop-fast-feedback-loop-fast-feedback-loop-is-all-you-need-devoxx-ma-24","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/fastfeedbackloop-devoxxmaupload-241003164039-1815f723-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Have you ever been on a project where desperation can get the better of you? It was more of an odyssey to get a change working in a real environment... in less than 1 or 2 hours? Or where to do a simple experiment, the flow you must follow until you deploy your changes takes one day... if not more? Ah yes, we've all been there, haven't we?\nGet ready in this session to understand how and why having the most agile feedback possible is a goal we should pursue individually, as a team goal (and in our company), seeing the many benefits it can bring us and how it can revolutionise our software development process. By minimising the time between code changes and receiving feedback, teams can accelerate bug detection, improve software quality, enhance collaboration ... and even make them happier than before. We’ll explore key components like continuous integration, automated testing, monitoring, highlighting best practices and strategies. Expect also to hear about DORA metrics, running experiments, feature flags, some numbers on costs and money savings, and cases based on real facts.\nAnd at the end, get ready to sing along (emulating a famous band): 🎶 \"Fast feedback loop, fast feedback loop, fast feedback loop is all you need!\" 🎶 😉\n\n---\nPresentation shared at Devoxx Morocco '24\n\nFeedback form:\nhttps://bit.ly/feedback-fast-feedkback-loop","tags":["feedback loop","testing","delivery"],"url":"https://www.slideshare.net/slideshow/all-you-need-is-fast-feedback-loop-fast-feedback-loop-fast-feedback-loop-is-all-you-need-devoxx-ma-24/272172280","userLogin":"icougil","userName":"Nacho Cougil","viewCount":214},{"algorithmId":"3","displayTitle":"5 Considerations When Adopting Automated Testing","isSavedByCurrentUser":false,"pageCount":14,"score":0.5533,"slideshowId":"41238309","sourceName":"cm_text","strippedTitle":"5-considerations-when-adopting-auto","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/columbusatdd11-6-2014-141106214654-conversion-gate02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Most organizations have realized the benefits of and need for test automation—but is your investment being wisely utilized? Are you unknowingly building a test automation suite that will end up costing more than your actual product? Are you building a legacy test automation framework that may be ready to retire before you reap the benefits? \r\nThis presentation will discuss five points of consideration that will help your organization answer these questions and mitigate risks that they bring into light.","tags":["quality assurance","automation","test"],"url":"https://www.slideshare.net/BhupeshDahalCSTEMCSD/5-considerations-when-adopting-auto","userLogin":"BhupeshDahalCSTEMCSD","userName":"Bhupesh Dahal","viewCount":522},{"algorithmId":"3","displayTitle":"Test automation lessons from WebSphere Application Server","isSavedByCurrentUser":false,"pageCount":53,"score":0.5529,"slideshowId":"56506829","sourceName":"cm_text","strippedTitle":"test-automation-lessons-from-websphere-application-server","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/webspheretestlessons070213-151229032520-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses WebSphere testing at IBM. It provides an overview of IBM's:\n- Extensive testing resources including over 200 engineers and thousands of systems. \n- Daily regression testing of over 1.7 million tests.\n- Transition from waterfall to agile development which reduced cycle times and resources needed for testing.\n- Use of cloud resources to speed up test deployment and automation.\n- Focus on creating meaningful regressions through techniques like integration acceptance tests run continuously on each build.","tags":[],"url":"https://www.slideshare.net/RobbieMinshallAus/test-automation-lessons-from-websphere-application-server","userLogin":"RobbieMinshallAus","userName":"Robbie Minshall","viewCount":608},{"algorithmId":"3","displayTitle":"All you need is fast feedback loop, fast feedback loop, fast feedback loop is...","isSavedByCurrentUser":false,"pageCount":61,"score":0.5525,"slideshowId":"270022719","sourceName":"cm_text","strippedTitle":"all-you-need-is-fast-feedback-loop-fast-feedback-loop-fast-feedback-loop-is-all-you-need","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/fastfeedbackloop-240702152302-3e3d85b7-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Join us in exploring the importance of having an agile feedback loop in software development.\n\nBy minimizing the time between code changes and receiving feedback, teams can accelerate bug detection, improve software quality, enhance collaboration, and increase happiness.\n\nWe'll discuss key components like continuous integration, automated testing, monitoring, and best practices and strategies. Discover the benefits of implementing DORA metrics, running experiments, using feature flags, and saving costs. Prepare to be inspired by real-life cases and understand how a fast feedback loop can revolutionize your development process.\n\nParticipants will be encouraged to adopt a \"fast feedback loop\" mentality, emphasizing the transformative impact it can have on the efficiency and effectiveness of software development and, at the end, be prepared to sing in chorus (emulating a famous band): \"Fast feedback loop, fast feedback loop, fast feedback loop is all you need!\" 😉\n\n---\nPresentation shared at WeAreDevelopers World Congress '24\n\nFeedback form:\nhttps://bit.ly/feedback-fast-feedkback-loop","tags":["feedback","fast","feedback loop"],"url":"https://www.slideshare.net/slideshow/all-you-need-is-fast-feedback-loop-fast-feedback-loop-fast-feedback-loop-is-all-you-need/270022719","userLogin":"icougil","userName":"Nacho Cougil","viewCount":44},{"algorithmId":"3","displayTitle":"what-is-devops.ppt","isSavedByCurrentUser":false,"pageCount":59,"score":0.5512,"slideshowId":"259526543","sourceName":"cm_text","strippedTitle":"whatisdevopsppt","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/what-is-devops-230731094406-39afad8b-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses DevOps, a methodology that combines software development (Dev) and IT operations (Ops). It describes how DevOps aims to improve collaboration between developers and operations teams to more quickly identify and solve problems, allowing for faster and more reliable software delivery. The document provides examples of how DevOps streamlines processes like continuous integration, delivery and deployment through automation and bringing the teams together into a single workflow.","tags":[],"url":"https://www.slideshare.net/slideshow/whatisdevopsppt/259526543","userLogin":"MohammadSamiuddin10","userName":"MohammadSamiuddin10","viewCount":62}],"moreFromUser":[{"algorithmId":"","displayTitle":"Finding Patterns in the Clouds - Cloud Design Patterns","isSavedByCurrentUser":false,"pageCount":81,"score":0,"slideshowId":"218658159","sourceName":"MORE_FROM_USER","strippedTitle":"finding-patterns-in-the-clouds-cloud-design-patterns","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/clouddesignpatterns-200111014501-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses the evolution of web application architectures from single server deployments to modern cloud-native microservice architectures. It covers how early web apps faced challenges as demand grew that led to adopting caching, load balancing, and the cloud. It then discusses how further scaling issues were addressed through containers, microservices, and patterns like API gateways and circuit breakers. Key lessons are around adopting cloud-native patterns to improve performance, scalability, resilience and developer productivity for applications.","tags":["design patterns","cloud","cloud computing"],"url":"https://www.slideshare.net/ardalis/finding-patterns-in-the-clouds-cloud-design-patterns","userLogin":"ardalis","userName":"Steven Smith","viewCount":446},{"algorithmId":"","displayTitle":"Introducing Domain Driven Design - codemash","isSavedByCurrentUser":false,"pageCount":83,"score":0,"slideshowId":"86185513","sourceName":"MORE_FROM_USER","strippedTitle":"introducing-domain-driven-design-codemash","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/introducingdomain-drivendesign-codemash-180115184413-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"\r\nDDD provides a set of patterns and practices for tackling complex business problems with software models. Learn the basics of DDD in this session, including several principles and patterns you can start using immediately even if your project hasn't otherwise embraced DDD. Examples will primarily use C#/.NET.","tags":["ddd","domain-driven design","design patterns"],"url":"https://www.slideshare.net/slideshow/introducing-domain-driven-design-codemash/86185513","userLogin":"ardalis","userName":"Steven Smith","viewCount":2244},{"algorithmId":"","displayTitle":"Introducing ASP.NET Core 2.0","isSavedByCurrentUser":false,"pageCount":66,"score":0,"slideshowId":"81246309","sourceName":"MORE_FROM_USER","strippedTitle":"introducing-aspnet-core-20","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/introducingasp-171026145646-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"A whirlwind tour of ASP.NET Core 2.0 presented at DogfoodCon 2017 in Columbus, Ohio. October 2017. Learn more at aspnetcorequickstart.com.","tags":["asp.net core","asp.net","asp.net mvc"],"url":"https://www.slideshare.net/ardalis/introducing-aspnet-core-20","userLogin":"ardalis","userName":"Steven Smith","viewCount":4929},{"algorithmId":"","displayTitle":"Decoupling with Domain Events","isSavedByCurrentUser":false,"pageCount":26,"score":0,"slideshowId":"66819406","sourceName":"MORE_FROM_USER","strippedTitle":"decoupling-with-domain-events","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/decouplingwithdomainevents-161006172217-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Given at DogFoodCon 2016 in Columbus, Ohio\r\n\r\nDomain Events, a Domain-Driven Design (DDD) pattern, provide a way to decouple your code. Rather than hard-coding a series of steps that must be completed in response to a particular action a user takes, that action can raise an event. Handlers for an event can be added without changing the code responsible for raising the event, resulting in a more extensible design. Coupled with SignalR or push notifications in the UI layer, domain events can trigger live updates, even to web-based applications and mobile apps.","tags":["domain-driven design","clean code","software development"],"url":"https://www.slideshare.net/slideshow/decoupling-with-domain-events/66819406","userLogin":"ardalis","userName":"Steven Smith","viewCount":2522},{"algorithmId":"","displayTitle":"A Whirldwind Tour of ASP.NET 5","isSavedByCurrentUser":false,"pageCount":23,"score":0,"slideshowId":"53695904","sourceName":"MORE_FROM_USER","strippedTitle":"a-whirldwind-tour-of-aspnet-5","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/whirldwindtourofasp-151008140441-lva1-app6892-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"ASP.NET 5 has been redesigned with an emphasis on speed, composability, and cross-platform support. The new ASP.NET is leaner, faster, open source, and fixes many of the inconsistencies and problems present in ASP.NET today.","tags":["asp.net","asp.net mvc","c#"],"url":"https://www.slideshare.net/slideshow/a-whirldwind-tour-of-aspnet-5/53695904","userLogin":"ardalis","userName":"Steven Smith","viewCount":1530},{"algorithmId":"","displayTitle":"Domain events","isSavedByCurrentUser":false,"pageCount":21,"score":0,"slideshowId":"52071188","sourceName":"MORE_FROM_USER","strippedTitle":"domain-events","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/domainevents-150826005238-lva1-app6891-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Domain Events, a Domain-Driven Design (DDD) pattern, provide a way to decouple your code. Rather than hard-coding a series of steps that must be completed in response to a particular action a user takes, that action can raise an event. Handlers for that event can be added without changing the code responsible for raising the event, resulting in a more extensible design. Coupled with SignalR in the UI layer, domain events can trigger updates to the application without the user having to refresh the application.","tags":["ddd","domain-driven design","design patterns"],"url":"https://www.slideshare.net/slideshow/domain-events/52071188","userLogin":"ardalis","userName":"Steven Smith","viewCount":813},{"algorithmId":"","displayTitle":"My Iraq Experience","isSavedByCurrentUser":false,"pageCount":85,"score":0,"slideshowId":"40463037","sourceName":"MORE_FROM_USER","strippedTitle":"my-iraq-experience","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/myiraqexperience-141019162638-conversion-gate01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"My 2004 deployment to Iraq and missions as a combat engineer platoon leader in support of EOD missions. Presented to Ravenna, Ohio Daughters of the American Revolution chapter 18 October 2014","tags":["engineers","iraq","army"],"url":"https://www.slideshare.net/slideshow/my-iraq-experience/40463037","userLogin":"ardalis","userName":"Steven Smith","viewCount":1584},{"algorithmId":"","displayTitle":"Add Some DDD to Your ASP.NET MVC, OK?","isSavedByCurrentUser":false,"pageCount":41,"score":0,"slideshowId":"39700232","sourceName":"MORE_FROM_USER","strippedTitle":"add-some-ddd-to-your-aspnet-mvc-ok","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/dddaspnetmvc-140930073619-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Improve the design of your ASP.NET MVC Solution by applying some principles and best practices from Domain-Driven Design.","tags":["ddd","architecture","asp.net mvc"],"url":"https://www.slideshare.net/slideshow/add-some-ddd-to-your-aspnet-mvc-ok/39700232","userLogin":"ardalis","userName":"Steven Smith","viewCount":7710},{"algorithmId":"","displayTitle":"Domain-Driven Design with ASP.NET MVC","isSavedByCurrentUser":false,"pageCount":41,"score":0,"slideshowId":"39623792","sourceName":"MORE_FROM_USER","strippedTitle":"ddd-aspnet-mvc","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/dddaspnetmvc-140928142602-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses Domain-Driven Design (DDD) and how it can be applied to ASP.NET MVC projects. It covers DDD concepts like ubiquitous language, bounded contexts, entities, value objects, domain services, and domain events. It also discusses how to structure an MVC project to separate the domain model from the rest of the application using patterns like layered architecture and ports and adapters. The document argues that DDD can provide benefits like flexibility, manageable complexity, and centralized business logic, though it may require more time and effort to implement.","tags":["asp.net","architecture","domain-driven design"],"url":"https://www.slideshare.net/slideshow/ddd-aspnet-mvc/39623792","userLogin":"ardalis","userName":"Steven Smith","viewCount":20633},{"algorithmId":"","displayTitle":"Breaking Dependencies to Allow Unit Testing","isSavedByCurrentUser":false,"pageCount":52,"score":0,"slideshowId":"39623737","sourceName":"MORE_FROM_USER","strippedTitle":"breaking-dependenciestoallowunittesting","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/breakingdependenciestoallowunittesting-140928142321-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Unit testing software can be difficult, especially when the software wasn't designed to be testable. Dependencies on infrastructure concerns and software we don't control are one of the biggest contributors to testing difficulty. In this session, you'll learn the difference between unit tests and other kinds of tests, how to recognize and invert dependencies, and how to unit test your code's interactions with these dependencies without testing the infrastructure itself.\r\n\r\nPresented at FalafelCON 2014, San Francisco, September 2014","tags":["unit testing","dependencies","architecture"],"url":"https://www.slideshare.net/slideshow/breaking-dependenciestoallowunittesting/39623737","userLogin":"ardalis","userName":"Steven Smith","viewCount":1560},{"algorithmId":"","displayTitle":"Refactoring with SOLID Principles (FalafelCon 2013)","isSavedByCurrentUser":false,"pageCount":59,"score":0,"slideshowId":"22808021","sourceName":"MORE_FROM_USER","strippedTitle":"refactoring-withsolid","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/refactoringwithsolid-130611085010-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":" We’ve all heard about well-designed software projects, where things aren’t (yet) a big ball of mud that’s painful to work with, but many of us aren’t lucky enough to work on these. Nor is it an option for us to get to start a brand new “greenfield” project, where we can leave behind the legacy of spaghetti code and technical debt our current project might have.\r\n\r\n \r\nBut there is hope! By applying refactoring steps based on SOLID principles of object oriented design, we can reduce the technical debt of our existing application, improve our code quality, and hopefully make our application more enjoyable and productive to work with.\r\n\r\n \r\nIn this session, we’ll briefly introduce the SOLID principles and several design patterns, and then we’ll apply these principles and patterns by improving the design of an existing application through several refactoring steps. ","tags":["solid principles","refactoring"],"url":"https://www.slideshare.net/slideshow/refactoring-withsolid/22808021","userLogin":"ardalis","userName":"Steven Smith","viewCount":5431},{"algorithmId":"","displayTitle":"Common asp.net design patterns aspconf2012","isSavedByCurrentUser":false,"pageCount":45,"score":0,"slideshowId":"13697232","sourceName":"MORE_FROM_USER","strippedTitle":"common-aspnet-design-patterns-aspconf2012","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/commonasp-netdesignpatternsaspconf2012-120719133113-phpapp01-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This document discusses common ASP.NET design patterns. It provides an overview of several design patterns including singleton, factory, repository, dependency injection, and MVC. It also demonstrates these patterns in code examples and discusses when to use certain patterns over others. Real world examples are given and it encourages the use of design patterns to reduce coupling and improve code organization, testability, and maintenance.","tags":["asp.net mvc","asp.net","design patterns"],"url":"https://www.slideshare.net/slideshow/common-aspnet-design-patterns-aspconf2012/13697232","userLogin":"ardalis","userName":"Steven Smith","viewCount":8016},{"algorithmId":"","displayTitle":"Common design patterns (migang 16 May 2012)","isSavedByCurrentUser":false,"pageCount":42,"score":0,"slideshowId":"12969230","sourceName":"MORE_FROM_USER","strippedTitle":"common-design-patterns-migang-16-may-2012","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/commondesignpatterns-migang2012-120517074812-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"A discussion of six common design patterns, when to use them, how they are implemented, and when to avoid them.","tags":["c#","solid principles","oop"],"url":"https://www.slideshare.net/slideshow/common-design-patterns-migang-16-may-2012/12969230","userLogin":"ardalis","userName":"Steven Smith","viewCount":1512},{"algorithmId":"","displayTitle":"Introducing Pair Programming","isSavedByCurrentUser":false,"pageCount":65,"score":0,"slideshowId":"7451260","sourceName":"MORE_FROM_USER","strippedTitle":"introducing-pair-programming","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/cincidayofagile-introducingpairprogramming-110330131129-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Pair programming involves two programmers working together at one computer. One person acts as the driver who types code while the other navigates and reviews. It has benefits like catching mistakes earlier, improving design quality, transferring knowledge between partners, and creating a stronger sense of team. While there is initially a 15% overhead in time, studies show this is outweighed by fewer defects and a more flexible system in the long run. Effective pair programming requires collaboration, respect, communication and regularly alternating roles.","tags":["pair programming","agile"],"url":"https://www.slideshare.net/slideshow/introducing-pair-programming/7451260","userLogin":"ardalis","userName":"Steven Smith","viewCount":4285},{"algorithmId":"","displayTitle":"Cinci ug-january2011-anti-patterns","isSavedByCurrentUser":false,"pageCount":51,"score":0,"slideshowId":"6754478","sourceName":"MORE_FROM_USER","strippedTitle":"cinci-ugjanuary2011antipatterns","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/cinci-ug-january2011-anti-patterns-110130165134-phpapp02-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The document discusses anti-patterns and worst practices in software development. Some examples covered include static cling pattern, flags over objects, premature optimization, copy-paste-compile, and reinventing the wheel. It also shares lessons learned from experiences, such as being mindful of date times across time zones, avoiding building SQL from untrusted inputs, and not being too cute with test data. Overall, the document aims to help developers learn from the mistakes of others and adopt better practices.","tags":["software development","antipatterns","worst practices"],"url":"https://www.slideshare.net/slideshow/cinci-ugjanuary2011antipatterns/6754478","userLogin":"ardalis","userName":"Steven Smith","viewCount":306}],"featured":null,"latest":[{"algorithmId":"4","displayTitle":"Dolibarr - What's new in 21.0 - DevCamp Nancy 2024.pptx","isSavedByCurrentUser":false,"pageCount":29,"score":0,"slideshowId":"273615547","sourceName":"LATEST","strippedTitle":"dolibarr-what-s-new-in-21-0-devcamp-nancy-2024-pptx","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/dolibarr-whatsnewin21-241126125933-8dbde38d-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Dolibarr - What's new in 21.0 - DevCamp Nancy 2024","tags":["dolibarr"],"url":"https://www.slideshare.net/slideshow/dolibarr-what-s-new-in-21-0-devcamp-nancy-2024-pptx/273615547","userLogin":"eldy10","userName":"Laurent Destailleur","viewCount":107},{"algorithmId":"4","displayTitle":"Data Modeling for Performance Masterclass: Why Data Modeling Matters","isSavedByCurrentUser":false,"pageCount":14,"score":0,"slideshowId":"273508580","sourceName":"LATEST","strippedTitle":"data-modeling-for-performance-masterclass-why-data-modeling-matters","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/felipedatamodelingforperformancemasterclass-241121221621-e8de67e5-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"In this talk, Felipe discusses real-world impacts of suboptimal data modeling (i.e., tales from the trenches).","tags":[],"url":"https://www.slideshare.net/slideshow/data-modeling-for-performance-masterclass-why-data-modeling-matters/273508580","userLogin":"ScyllaDB","userName":"ScyllaDB","viewCount":191},{"algorithmId":"4","displayTitle":"Artefactual AtoM Priorities November 2024","isSavedByCurrentUser":false,"pageCount":7,"score":0,"slideshowId":"273591809","sourceName":"LATEST","strippedTitle":"artefactual-atom-priorities-november-2024","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/artefactual-atom-priorities-november-2024-241125183645-1d5c0bf7-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Artefactual update November 2024 about AtoM plans and current roadmap","tags":[],"url":"https://www.slideshare.net/slideshow/artefactual-atom-priorities-november-2024/273591809","userLogin":"accesstomemory","userName":"Artefactual Systems - AtoM","viewCount":107},{"algorithmId":"4","displayTitle":"5 Data Integration Techniques to Improve Your Excel Data","isSavedByCurrentUser":false,"pageCount":60,"score":0,"slideshowId":"273621450","sourceName":"LATEST","strippedTitle":"5-data-integration-techniques-to-improve-your-excel-data-7d10","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/5dataintegrationtechniquestoimproveyourexceldata-241126173705-1f973206-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Excel is a staple format that most organizations use and share. We trust Excel with some of our most important data. Yet, managing your data within Excel can quickly become a tangled web of data and tabular inefficiency.\n\nMany organizations are turning to workflow-based environments to help prepare, integrate and automate their Excel data in a fraction of the time.\n\nIn this webinar, learn how data integration methods using the FME Platform can help you:\n\n-Integrate Excel data with other formats\n-Validate Excel data\n-Automate repetitive workflows\n-Prepare Excel data for other applications\n-Generate reports\n\nWith no need for coding or scripting, achieving remarkable results with effective Excel data management has never been easier.","tags":["arcgis","webinar","apps"],"url":"https://www.slideshare.net/slideshow/5-data-integration-techniques-to-improve-your-excel-data-7d10/273621450","userLogin":"SafeSoftware","userName":"Safe Software","viewCount":244},{"algorithmId":"4","displayTitle":"Role of Generative AI in Cybersecurity.pdf","isSavedByCurrentUser":false,"pageCount":11,"score":0,"slideshowId":"273522963","sourceName":"LATEST","strippedTitle":"role-of-generative-ai-in-cybersecurity-pdf","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/roleofgenerativeaiincybersecurity-241122110034-ef53ef13-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"In the field of machine learning known as “generative AI,” models are trained to produce new data that bears similarities to the features and patterns of the input data. With the use of this technology, there are countless opportunities now available for advances in problem-solving, creativity, and content production. According to McKinsey, generative AI has the potential to boost the world economy by trillions of dollars per year.\n\nBut because generative AI uses a lot of data, businesses need to be careful about data security and privacy. Large language models (LLMs) and other Generative AI models create privacy problems due to their nature, which involves memory and association. Large volumes of training data, including potentially sensitive information that might be exploited or leaked, can be memorized by LLMs. ","tags":["generative ai in cybersecurity","generative ai","cybersecurity"],"url":"https://www.slideshare.net/slideshow/role-of-generative-ai-in-cybersecurity-pdf/273522963","userLogin":"SoluLab1231","userName":"SoluLab1231","viewCount":18},{"algorithmId":"4","displayTitle":"SkullCap – An IoT based Smart Helmet for Accident Detection - PPT","isSavedByCurrentUser":false,"pageCount":34,"score":0,"slideshowId":"273529903","sourceName":"LATEST","strippedTitle":"skullcap-an-iot-based-smart-helmet-for-accident-detection","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/skullcap8-241122175532-9b5d4d30-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"SkullCap – An IoT based Smart Helmet for Accident Detection - PPT\r\n\r\nMar Baselios Institute of Technology and Science (MBITS) - Nellimattam ","tags":["skullcap","iot","smart helmet"],"url":"https://www.slideshare.net/slideshow/skullcap-an-iot-based-smart-helmet-for-accident-detection/273529903","userLogin":"GeevargheseSIsaac1","userName":"GeevargheseSIsaac1","viewCount":18},{"algorithmId":"4","displayTitle":"The Practical Reality of AI and Large Language Models (LLMs)in Transforming B...","isSavedByCurrentUser":false,"pageCount":42,"score":0,"slideshowId":"273504791","sourceName":"LATEST","strippedTitle":"the-practical-reality-of-ai-and-large-language-models-llms-in-transforming-business-operations","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/eis-webinar-ai-search-session-5-transforming-business-ops-2024-11-19-241121180555-02920e71-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Explore the intersection of AI and large language models in transforming business operations. Discuss real-world applications, from automating customer service to enhancing decision-making processes. Examine the implications for various industries, and how LLMs can drive competitive advantages. Emphasize the need for accurate data integration to avoid hallucinations and ensure reliable outputs.\n\nThis session will delve into the convergence of AI and LLMs, focusing on practical business applications and competitive advantages.\n\nReal-World Applications: How AI and LLMs are being utilized in customer service, decision-making, and other business areas.\nExplore how AI and large language models revolutionize business operations. From enhancing customer service to empowering decision-making, discover practical AI applications across marketing, supply chain, HR, finance, and beyond.\nIndustry-Specific Impacts: Assessing the implications for industries such as finance, healthcare, retail, and manufacturing.\n\nExamine how AI and large language models are reshaping key industries. This topic explores the unique challenges and opportunities AI presents across diverse sectors.\n\nCompetitive Advantages: Understanding how LLMs can drive business efficiencies and innovation.\nLearn how businesses leverage LLMs to automate tasks, enhance decision-making, and develop cutting-edge products and services, ultimately gaining an edge in today's competitive marketplace.\n\nCase Studies: Examples of businesses successfully leveraging AI and LLMs for operational improvements.\nDiscover real-world success stories of companies harnessing AI and large language models to transform their operations. These case studies showcase how diverse businesses have implemented LLMs to boost productivity, enhance customer experiences, and drive growth across multiple industries. ","tags":["ai","llms","large language models"],"url":"https://www.slideshare.net/slideshow/the-practical-reality-of-ai-and-large-language-models-llms-in-transforming-business-operations/273504791","userLogin":"Earley","userName":"Earley Information Science","viewCount":148},{"algorithmId":"4","displayTitle":"Securiport - Advanced Border Security Solutions","isSavedByCurrentUser":false,"pageCount":8,"score":0,"slideshowId":"273577500","sourceName":"LATEST","strippedTitle":"securiport-advanced-border-security-solutions","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/securiport-advancedbordersecuritysolutions-241125073651-053c27e9-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Securiport has won many awards for its border security operations. The company utilizes innovation and technology to optimize transnational travel safety.","tags":["securiport"],"url":"https://www.slideshare.net/slideshow/securiport-advanced-border-security-solutions/273577500","userLogin":"Securiport","userName":"Securiport ","viewCount":55},{"algorithmId":"4","displayTitle":"SF Welly Trailblazer Community Xmas 2024","isSavedByCurrentUser":false,"pageCount":8,"score":0,"slideshowId":"273540764","sourceName":"LATEST","strippedTitle":"sf-welly-trailblazer-community-xmas-2024","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/sfwellyxmas2024-241123083748-8ebd6407-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This is the slide deck of the Salesforce Wellington user group community final gathering for 2024. The event included as presentation by BCITO of theior Copado capability as well as a Christmas song generated in reggae style by Slalom. And also the photo booth sponsored by Upper Echelon","tags":["salesforce admins","trailblazer community","copado"],"url":"https://www.slideshare.net/slideshow/sf-welly-trailblazer-community-xmas-2024/273540764","userLogin":"AnnaLoughnanColquhou","userName":"Anna Loughnan Colquhoun","viewCount":131},{"algorithmId":"4","displayTitle":"Deadlocks in SQL - Turning Fear Into Understanding (by Sergii Stets)","isSavedByCurrentUser":false,"pageCount":33,"score":0,"slideshowId":"273680999","sourceName":"LATEST","strippedTitle":"deadlocks-in-sql-turning-fear-into-understanding-by-sergii-stets","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/deadlocksinsql-turningfearintounderstandingbysergiistetsedited-241128143513-d37daefa-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Обговоримо, що таке дедлоки, чому вони виникають і як їх ефективно усувати.\n\nВідео та деталі заходу: https://bit.ly/4eTaN8K","tags":["java","deadlocks","sql"],"url":"https://www.slideshare.net/slideshow/deadlocks-in-sql-turning-fear-into-understanding-by-sergii-stets/273680999","userLogin":"GlobalLogicUkraine","userName":"GlobalLogic Ukraine","viewCount":24},{"algorithmId":"4","displayTitle":"3D and Cultural Heritage, Kate Fernie, CARARE","isSavedByCurrentUser":false,"pageCount":17,"score":0,"slideshowId":"273612106","sourceName":"LATEST","strippedTitle":"3d-and-cultural-heritage-kate-fernie-carare","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/3dculturalheritageitalynov24-241126104558-e0b68ebe-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"A presentation on 3D and Cultural heritage given by Kate Fernie during an Italian country group workshop on the \"Challenges of Digital Cultural Heritage\nAggregation, Shared Services, 3D\" on the 25th November 2024.\nThe presentation gives a case study illustrating some of the uses of 3D in the Hunt Museum, some essential tips for cultural heritage organisations who are starting out in 3D.\n","tags":["carare","europeana","data space"],"url":"https://www.slideshare.net/slideshow/3d-and-cultural-heritage-kate-fernie-carare/273612106","userLogin":"CARARE","userName":"CARARE","viewCount":18},{"algorithmId":"4","displayTitle":"OutSystems User Group November 2024","isSavedByCurrentUser":false,"pageCount":11,"score":0,"slideshowId":"273617929","sourceName":"LATEST","strippedTitle":"turn-outsystems-application-data-into-ai-conversations","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/20241121osugutrechtfunctioncalling-241126144257-420e444f-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"We will explore the process of creating a prompt flow that dynamically interacts with custom tools built in O11/OutSystems Developer Cloud. This interaction is based on user input and retrieves data from your applications to generate relevant and up-to-date responses. Participants will gain insight into leveraging LLM capabilities to enhance their application's functionality and user experience.","tags":["outsystems","artificial intelligence","user group"],"url":"https://www.slideshare.net/slideshow/turn-outsystems-application-data-into-ai-conversations/273617929","userLogin":"mail496323","userName":"mail496323","viewCount":37},{"algorithmId":"4","displayTitle":"TrustArc Webinar - Into The Future: The Evolution of AdTech \u0026 Data Privacy","isSavedByCurrentUser":false,"pageCount":21,"score":0,"slideshowId":"273506968","sourceName":"LATEST","strippedTitle":"trustarc-webinar-into-the-future-the-evolution-of-adtech-data-privacy","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/trustarcwebinar-intothefuturetheevolutionofadtechdataprivacy-241121202719-e46f4e4d-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The advertising technology space and landscape continue to evolve and adapt – increasingly providing the ability for tracking, attribution, interest-based ads, and tailoring. These advancements have resulted in more and more information, personal and otherwise, being ingested by virtue of advertising and ad-based tracking. \n\nJoin experts from TrustArc, DoubleVerify, Mintz, and Digital Advertising Alliance as they discuss the emerging regulatory landscape, how organizations can stay abreast of continued technological innovations, and how they can implement strategies to help them comply with adtech privacy laws, continuing self-regulation, and consent and preference management of third and first-party data.\n\nThis webinar will review:\n- How your organization can continue to collect data, while ensuring customer trust\n- The new ways to manage consent and preferences\n- Privacy expert advice on your use of emerging advertising technologies","tags":["advertising technologies","adtech","data privacy"],"url":"https://www.slideshare.net/slideshow/trustarc-webinar-into-the-future-the-evolution-of-adtech-data-privacy/273506968","userLogin":"TrustArc","userName":"TrustArc","viewCount":353},{"algorithmId":"4","displayTitle":"Finding observability and DevEx tranquility sailing the monitoring data seas","isSavedByCurrentUser":false,"pageCount":32,"score":0,"slideshowId":"273532785","sourceName":"LATEST","strippedTitle":"finding-observability-and-devex-tranquility-sailing-the-monitoring-data-seas","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/findingobservabilityanddevextranquilitysailingthemonitoringdataseas-241122221743-a3dbeb6b-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Elevator pitch: In rapidly expanding cloud-native ecosystem, managing distributed architectures feels like navigating stormy seas with waves of telemetry data. Yet this data can offer vital insights to sail smoothly. This session will explore strategies to avoid drowning, improving DevEx, and more.\nAbstract: The cloud-native ecosystem has grown exponentially in the last few years, as has the complexity of the distributed architectures being built. In a context where keeping up with technology requires a substantial amount of computational power and data, monitoring our cloud-native applications has become a constant struggle against the storm.\nThe ever-increasing volume of traces, metrics, events, and logs generated by our systems is a double-edged sword: on one hand, if not managed correctly, becoming a distraction from needed insights. On the other hand, if approached with care and thought, providing organizations the chance to sail calm cloud-native seas.\nIn this session, we will discover how to avoid drowning in the sea of monitoring data, instead understanding how to provide insights while using only what is needed. We will explore the emerging scenarios on the horizon, abandoning the oars and testing the waters of artificial intelligence as it applies to our observability use cases.\nWe will discuss how to leverage monitoring data, conversational DevEx, and anomaly prediction, among other topics, in this talk.\nBenefits to the ecosystem: Attendees of this talk will gain practical strategies for managing the overwhelming volume of monitoring data in cloud-native environments. They will learn how to identify and use essential data to derive valuable insights, improve observability with emerging technologies, and enhance developer experience through conversational interfaces. Additionally, they will explore AI-driven techniques for predictive anomaly detection, enabling them to navigate and optimize their complex distributed systems effectively. Overall, attendees will leave equipped with the knowledge to transform monitoring challenges into opportunities for smoother and more efficient operations.","tags":["platform","platform engineering","cloud native observability"],"url":"https://www.slideshare.net/slideshow/finding-observability-and-devex-tranquility-sailing-the-monitoring-data-seas/273532785","userLogin":"eschabell","userName":"Eric D. Schabell","viewCount":48},{"algorithmId":"4","displayTitle":"UiPath Community Day Warsaw: Devs4Devs Conference","isSavedByCurrentUser":false,"pageCount":142,"score":0,"slideshowId":"273525885","sourceName":"LATEST","strippedTitle":"uipath-community-day-warsaw-devs4devs-conference","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/communitydaywarsawmasterdeck-241122133938-fe183b3e-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Welcome to our second in-person UiPath Community Day in Poland! 🚀 Following the success of our Krakow gathering in June, we invite you to join us in Warsaw to meet our Polish network and find out all the UiPath news \u0026 updates\n\nJoin us for a wonderful half-day of networking and insightful sessions covering the UiPath Platform latest developments, including the latest on Agentic AI!\nSee our detailed agenda below:\n10:00 Opening notes\nCristina Vidu, Senior Manager, Marketing Community @UiPath\n10:05 Isn’t it easy? Using Microsoft Graph with UiPath and building custom O365 scope\nKacper Korona, Lead RPA Developer, @Orsted\n10:30 The Awakening of Automation: Autopilot and Agentic Automation in Action\nPiotr Zajac, Solution Consultant, AI \u0026 ML @UiPath\n11:00 Document Understanding powered by Generative AI\nDaniel Chrapczynski, Autonomous Enterprise Manager @Mindbox\n12:00 The Lazy Developer’s Guide to CI/CD: Automating RPA Deployments\nVladyslav Rishniak, Business Automation Developer @SD Solutions\n12:25 How dedicated platform team enables fast delivery in UiPath environment\nMichał Cholewski, Automation Specialist @Orsted\n12:50 How AI can save lives. A use case powered by UiPath Apps and AI\nMikołaj Zieliński, UiPath MVP, UiPath Lead @Proservartner \n13:20 MVP Program open applications: learn all about our top community experts and advocates, the UiPath MVPs\nKamil Miśko , UiPath MVP, Senior RPA Developer/Solution Architect @Zurich Insurance\n13:30 Community Quiz: gather round to win our UiPath swag prizes!! 🏆\n","tags":["#rpa","#uipath","#uipathcommunity"],"url":"https://www.slideshare.net/slideshow/uipath-community-day-warsaw-devs4devs-conference/273525885","userLogin":"UiPathCommunity","userName":"UiPathCommunity","viewCount":171},{"algorithmId":"4","displayTitle":"UiPath Veterans RPA Studio track program -Session 4: Advanced practices with ...","isSavedByCurrentUser":false,"pageCount":30,"score":0,"slideshowId":"273506749","sourceName":"LATEST","strippedTitle":"uipath-veterans-rpa-studio-track-program-session-4-advanced-practices-with-studio-and-orchestrator","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/veteranprogramsession-4002-241121201055-b7c15241-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"In this session we will learn all about email automation, advanced selectors, and error handling with UiPath Studio.\n\n📕 Agenda:\n\nSend Email using Automation\nBasic String Manipulation\nDate Formatting\nAdvanced selectors\nDebugging and error handling in Studio\nLeveraging Orchestrator Assets\nMaking use of Orchestrator Queues\nHow to publish a project in Studio\nDeployment to Orchestrator\nDemo - follow-along\nYour trainers:\n\n🤵 Pradeep Shukla, 3X UiPath MVP, Chief Technologist Peraton, Inc\n\n🤵 Chris Bolin, 3X UiPath MVP, Director of Intelligent Automation Anika Systems\n\n👩🏫 Tracy Dixon, a 5x UiPath MVP, has led the Centric Consulting team for five years. She is responsible for operational excellence and UiPath Partnership Lead.\n\n🤵 Jeremy Gilliland, 2X UiPath MVP, RPA CoE Lead\n\n\n\nYour host:\n\n👩🏻 Diana Gray, Diana Gray, Senior Community Marketing Manager, AMER @UiPath","tags":["#uipathcommunity","#uipath","#veterans"],"url":"https://www.slideshare.net/slideshow/uipath-veterans-rpa-studio-track-program-session-4-advanced-practices-with-studio-and-orchestrator/273506749","userLogin":"DianaGray10","userName":"DianaGray10","viewCount":47},{"algorithmId":"4","displayTitle":"Algebraic-Structures with one operation as well as two operations and its var...","isSavedByCurrentUser":false,"pageCount":53,"score":0,"slideshowId":"273556860","sourceName":"LATEST","strippedTitle":"algebraic-structures-with-one-operation-as-well-as-two-operations-and-its-variations-like-semigru","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/algebraic-structures-final-241124084652-8b3d5bfb-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"understand algebraic structure, semigroup, monoid ,group and various solved examples","tags":[],"url":"https://www.slideshare.net/slideshow/algebraic-structures-with-one-operation-as-well-as-two-operations-and-its-variations-like-semigru/273556860","userLogin":"rajanimandhare80","userName":"rajanimandhare80","viewCount":94},{"algorithmId":"4","displayTitle":"Top Mobile App Development Trends in 2025 What's Driving Innovation.pdf","isSavedByCurrentUser":false,"pageCount":11,"score":0,"slideshowId":"273540051","sourceName":"LATEST","strippedTitle":"top-mobile-app-development-trends-in-2025-what-s-driving-innovation-pdf","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/topmobileappdevelopmenttrendsin2025whatsdrivinginnovation-241123073945-b7b5bbbd-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"The mobile app industry is evolving at a breakneck pace, driven by advancements in technology and changing user expectations. As we approach 2025, several key trends are set to redefine how mobile applications are developed, designed, and experienced. For businesses and developers alike, staying abreast of these mobile app development trends for 2025 is crucial to creating engaging, efficient, and future-proof mobile solutions. In this blog, we’ll explore the most significant trends that will shape the future of mobile app development.","tags":["app development"],"url":"https://www.slideshare.net/slideshow/top-mobile-app-development-trends-in-2025-what-s-driving-innovation-pdf/273540051","userLogin":"marketing246348","userName":"marketing246348","viewCount":19},{"algorithmId":"4","displayTitle":"Evaluating RAG pipelines built on unstructured data","isSavedByCurrentUser":false,"pageCount":11,"score":0,"slideshowId":"273592670","sourceName":"LATEST","strippedTitle":"evaluating-rag-pipelines-built-on-unstructured-data-5da7","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/arizeai-hakantekgul-unstructureddatameetupnovember2024-241125192254-8ad082cd-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"This talk will cover different techniques for evaluating a RAG pipeline built on unstructured data. Standing up a basic RAG pipeline is becoming easier every day, however identifying weak points in your application or dataset remains a challenge. We'll review how you can use traditional assertion-based evaluation techniques, LLM-as-a-Judge approaches, and embedding visualization tools to improve your pipeline using Arize Phoenix.\n\n","tags":[],"url":"https://www.slideshare.net/slideshow/evaluating-rag-pipelines-built-on-unstructured-data-5da7/273592670","userLogin":"chloewilliams62","userName":"Zilliz ","viewCount":62},{"algorithmId":"4","displayTitle":"Innovation and Patient-Centric Design Revolutionize Healthcare Web Developmen...","isSavedByCurrentUser":false,"pageCount":9,"score":0,"slideshowId":"273579469","sourceName":"LATEST","strippedTitle":"innovation-and-patient-centric-design-revolutionize-healthcare-web-development-pdf","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/innovationandpatient-centricdesignrevolutionizehealthcarewebdevelopment-241125091011-52420f82-thumbnail.jpg?width=600\u0026height=600\u0026fit=bounds","description":"Discover how innovation and patient-centric design are transforming healthcare web development, delivering seamless user experiences, improved accessibility, and personalized care solutions. Read More","tags":["website development company","helathcare web development","healthacre web application"],"url":"https://www.slideshare.net/slideshow/innovation-and-patient-centric-design-revolutionize-healthcare-web-development-pdf/273579469","userLogin":"SeasiaInfotech2","userName":"SeasiaInfotech2","viewCount":26}]},"secretUrl":"3FzNAJNnFsIa1v","shouldShowAds":true,"slides":{"host":"https://image.slidesharecdn.com","title":"Improving-the-Design-of-Existing-Software","imageLocation":"improvingthedesignofexistingsoftware-171026145936","imageSizes":[{"quality":85,"width":320,"format":"jpg"},{"quality":85,"width":638,"format":"jpg"},{"quality":75,"width":2048,"format":"webp"}]},"smsShareUrl":"sms:?body=Check out this SlideShare : https://www.slideshare.net/slideshow/improving-the-design-of-existing-software-81246420/81246420","strippedTitle":"improving-the-design-of-existing-software-81246420","thumbnail":"https://cdn.slidesharecdn.com/ss_thumbnails/improvingthedesignofexistingsoftware-171026145936-thumbnail.jpg?width=640\u0026height=640\u0026fit=bounds","title":"Improving the Design of Existing Software","totalSlides":85,"transcript":["Improving the Design of\nExisting Software\nSteve Smith\nFounder, DevIQ\n@ardalis | DevIQ.com\n ","My Pluralsight Courses\n ","Weekly DevTips\nPodcast and Newsletter\n• Ardalis.com/tips\n• WeeklyDevTips.com\n ","Software Rots\n ","","","Technical Debt\n• Low quality code and shortcuts in our applications\n• Financial Debt\n• Principal – Amount borrowed\n• Interest – Additional cost of the debt\n• Technical debt\n• Principal – Amount of time required to code solution “properly”\n• Interest – Additional time needed to work around improper code\nhttp://deviq.com/technical-debt/\n ","http://www.jimhighsmith.com/\n ","","A Well-Designed Application\nis\nSimple\nto\nMaintain and Extend\n ","Technical Debt\nis a\nDesign Decision\n(or series of decisions)\n ","Paying DownTechnical Debt\nImproves\nApplication Design and Quality\n ","","Preventive Maintenance\n• Refactoring\n• Eliminate Duplication\n• Simplify Design\n• AutomatedTests\n• Verify correctness\n• Avoid regressions\n• Increase Confidence\n ","When should you refactor?\n• While delivering value\n ","“\n”\nYou don’t need permission to practice basic hygiene\nwhen you write software.\nhttp://ardalis.com/when-should-you-refactor/\nMake cleaning up your code something you do as part of writing code.\n ","","Refactoring Should Not Change System\nBehavior\n ","The Refactoring Process\n• Verify existing behavior\n• Write CharacterizationTests if none exist\n• Find test points\n• Break dependencies\n• Apply Refactoring\n• Confirm existing behavior is preserved\n Commit the working code!\nCommit the working code!\n ","CharacterizationTests\nProcess\n1. Write a test you know will fail\n2. Use the output of the failing test to determine the existing behavior to\nassert\n3. Update the test with the new value/behavior\n4. Run the test again – it should now pass\n ","","Brownfield / Legacy Development\n ","Maximize Code Changes\nMade to\nNew Classes\n ","Why new classes?\n• Nothing depends on them (yet)\n• You can write them to be testable\n• Even in an otherwise hard-to-test application\n ","Add High-ValueTests to Legacy Apps\n• Probably not writtenTest-First\n• Trying to UnitTest Everything is likely cost-prohibitive\n• Start by writing tests for bugs\n• Verify the bug behavior with a test\n• Make the test pass by fixing the bug\n ","S O L I DPrinciples\nhttp://flickr.com/photos/kevinkemmerer/2772526725/\n ","Principles of OO Design\n0. Don’t RepeatYourself (DRY)\n1. Single Responsibility\n2. Open/Closed\n3. Liskov Substitution\n4. Interface Segregation\n5. Dependency Inversion\nPluralsight Course:\nhttp://bit.ly/SOLID-OOP\n ","","","Don’t Repeat\nRepeatYourself\n•Duplication in logic calls for abstraction\n•Duplication in process calls for automation\n ","Common Refactorings\n• Replace Magic Number/String\n• Parameterize Method\n• Pull Up Field\n• Pull Up Method\n• Replace Conditional With Polymorphism\n• Introduce Method\n ","Common Source of Repetition: Role Checks\nif(user.IsInRole(“Admins”)\n{\n// allow access to resource\n}\n// favor privileges over role checks\n// ardalis.com/Favor-Privileges-over-Role-Checks\nvar priv = new ContentPrivilege(user, article);\nif(priv.CanEdit())\n{\n// allow access\n}\n ","Visual Studio Code Clones\n• Find similar blocks of code in your projects/solution\n• Can detect matches that are similar but vary in small ways (like variable\nnames)\n• Available inVS2015 Premium and Ultimate\n ","","Single Responsibility Principle\nThe Single Responsibility Principle states that every object should have a single\nresponsibility, and that responsibility should be entirely encapsulated by the\nclass.\nWikipedia\nThere should never be more than one reason for a class to change.\nRobert C. “Uncle Bob” Martin\n ","What is a responsibility?\n“My CustomerManager class is only responsible for\nanything to do with a Customer.That follows SRP, right?”\n ","Examples of Responsibilities\n• Persistence\n• Validation\n• Notification\n• Error Handling\n• Logging\n• Class Selection / Construction\n• Formatting\n• Parsing\n• Mapping\n ","Dependency and Coupling\n• Excessive coupling makes changing legacy software difficult\n• Breaking apart responsibilities and dependencies is a large part of working\nwith existing code\n ","Common Refactorings\n• Extract Class\n• Extract Method\n• Move Method\n ","Heuristics and Code Smells\n• Visual Studio Metrics\n ","Cyclomatic Complexity\nhttps://en.wikipedia.org/wiki/Cyclomatic_complexity\n ","Keep\nCyclomatic Complexity\nunder 10\nfor every method\n ","","Code Smell: Regions\nMore on Regions: http://ardalis.com/regional-differences\n ","","Open / Closed Principle\nThe Open / Closed Principle states that software entities (classes, modules,\nfunctions, etc.) should be open for extension, but closed for modification.\nWikipedia\n ","Open / Closed Principle\nOpen to Extension\nNew behavior can be added in the future\nClosed to Modification\nChanges to source or binary code are not required\nDr. Bertrand Meyer originated the OCP term in his 1988 book, ObjectOrientedSoftwareConstruction\n ","Common Refactorings\n• Extract Interface / Apply Strategy Pattern\n• Parameterize Method\n• FormTemplate Method\n ","OCP Fail\n ","OCP OK\n ","OCP Fail\npublic bool IsSpecialCustomer(Customer c)\n{\nif(c.Country == “US” \u0026\u0026 c.Balance \u003c 50) return false;\nif(c.Country == “DE” \u0026\u0026 c.Balance \u003c 25) return false;\nif(c.Country == “UK” \u0026\u0026 c.Balance \u003c 35) return false;\nif(c.Country == “FR” \u0026\u0026 c.Balance \u003c 27) return false;\nif(c.Country == “BG” \u0026\u0026 c.Balance \u003c 29) return false;\nif(c.Age \u003c 18 || c.Age \u003e 65) return false;\nif(c.Income \u003c 50000 \u0026\u0026 c.Age \u003c 30) return false;\nreturn true;\n}\n ","OCP OK\nprivate IEnumerable\u003cICustomerRule\u003e _rules;\npublic bool IsSpecialCustomer(Customer customer)\n{\nforeach(var rule in _rules)\n{\nif(rule.Evaluate(customer) == false) return false;\n}\nreturn true;\n}\n ","","Liskov Substitution Principle\nThe Liskov Substitution Principle states that Subtypes must be substitutable for\ntheir base types.\nAgile Principles, Patterns, and Practices in C#\nNamed for Barbara Liskov, who first described the principle in 1988.\n ","Common Refactorings\n• Collapse Hierarchy\n• Pull Up / Push Down Field\n• Pull Up / Push Down Method\n ","Liskov Substitution Fail\nforeach(var employee in employees)\n{\nif(employee is Manager)\n{\nHelpers.PrintManager(employee as Manager);\nbreak;\n}\nHelpers.PrintEmployee(employee);\n}\n ","Liskov Substitution OK\nforeach(var employee in employees)\n{\nemployee.Print();\n// or\nHelpers.PrintEmployee(employee);\n}\n ","Nulls Break Polymorphism\nforeach(var employee in employees)\n{\nif(employee == null)\n{\n// print not found message\nbreak;\n}\nHelpers.PrintEmployee(employee);\n} http://ardalis.com/nulls-break-polymorphism\n ","","Interface Segregation Principle\nThe Interface Segregation Principle states that Clients should not be\nforced to depend on methods they do not use.\nAgile Principles, Patterns, and Practices in C#\nCorollary:\nPrefer small, cohesive interfaces to “fat” interfaces\n ","Common Refactorings\n• Extract Interface\n ","Keep Interfaces Small and Focused\n ","Membership Provider\n ","ISP Fail (sometimes)\npublic IRepository\u003cT\u003e\n{\nT GetById(int id);\nIEnumerable\u003cT\u003e List();\nvoid Create(T item);\nvoid Update(T item);\nvoid Delete(T item);\n}\n ","ISP OK (i.e. to support CQRS)\npublic IRepository\u003cT\u003e : IReadRepository\u003cT\u003e,\nIWriteRepository\u003cT\u003e\n{ }\npublic IReadRepository\u003cT\u003e\n{\nT GetById(int id);\nIEnumerable\u003cT\u003e List();\n}\npublic IWriteRepository\u003cT\u003e\nvoid Create(T item);\nvoid Update(T item);\nvoid Delete(T item);\n}\nExisting implementations of\nIRepository\u003cT\u003e are\nunaffected by pulling out\nsmaller interfaces!\nNo existing code breaks!\n ","","Dependency Inversion Principle\nHigh-level modules should not depend on low-level modules. Both\nshould depend on abstractions.\nAbstractions should not depend on details. Details should depend on\nabstractions.\nAgile Principles, Patterns, and Practices in C#\n ","Dependency Inversion Principle\n• Depend on Abstractions\n• Interfaces, not concrete types\n• Inject Dependencies into Classes\n• Structure Solution so Dependencies FlowToward Core\n• Onion Architecture (a.k.a. Ports and Adapters, a.k.a. Hexagonal Architecture)\n ","DIP Architecture (aka Ports and Adapters)\n ","Common Dependencies\n• Framework\n• Third Party Libraries\n• Database\n• File System\n• Email\n• Web Services\n• System Resources (Clock)\n• Configuration\n• The new Keyword\n• Static methods\n• Thread.Sleep\n• Random\nSee also responsibilities:\n• Persistence\n• Validation\n• Notification\n• Error Handling\n• Logging\n• Class Selection /\nConstruction\n• Formatting\n• Parsing\n• Mapping\n ","Common Refactorings\n• Extract Class\n• Extract Interface / Apply Strategy Pattern\n• Extract Method\n• Introduce Service Locator / Container\n ","DIP Fail\n ","Hidden Dependencies\n• Checkout Depends on an available SMTP server, but the class doesn’t reflect\nthis\n• Follow the Explicit Dependencies Principle\n• http://deviq.com/explicit-dependencies-principle/\n ","Some Improvement (Façade)\n ","DIP OK (Strategy Pattern / DI)\n ","DIP OK (Strategy Pattern / DI)\n ","Improving Quality Across the Industry\n ","","Self-Improvement and Quality\n• How fast can you produce:\n• Code you believe to be of high quality\n• Code that maybe gets the job done, but you believe to be of low quality\n• Which one can you produce more quickly?\n• Why?\n• How can we develop our skills and our tools so that building quality is\nnatural and easier than not doing so?\n ","0\n2\n4\n6\n8\n10\n12\n14\n16\nWeek 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 9\nUser Stories Completed\nHigh Quality Low Quality\n ","0\n2\n4\n6\n8\n10\n12\n14\n16\n18\n20\nWeek 1 Week 2 Week 3 Week 4 Week 5 Week 6 Week 7 Week 8 Week 9\nUser Stories Completed\nHigh Quality Low Quality\n ","Summary\n•Maintain / Improve Application Code\n•Follow DRY/SOLID Principles\n•Use CharacterizationTests to “fix” behavior\n•Apply Common Refactorings\n•Re-runTestsAfter (and during) Refactorings\n•Be Explicit About Class Dependencies\n•Train and Practice toWrite Better Code Faster\n ","Learn More\n• DevIQ.com\n• Ardalis.com\n• WeeklyDevTips.com\n• Twitter: @ardalis\n• Pluralsight:\n• SOLID Principles of OO Design http://bit.ly/SOLID-OOP\n• N-Tier Architecture in C# http://bit.ly/PS-NTier1\n• Refactoring Fundamentals http://bit.ly/PS-Refactoring\n• Domain-Driven Design Fundamentals http://bit.ly/ddd-fundamentals\n• Design Pattern Library http://bit.ly/PS-design-patterns\n• Pair Programming http://bit.ly/PS-PairProgramming\n ","• New Coworking Space in Hudson,Ohio\n• Private offices / Flex desk spaces\n• Fiber internet\n• Complimentary coffee / tea / water\n• Great development community\n• @techhubhudson\n• Website online soon\nTech Hub Hudson\n ","Books\n Refactoring http://amzn.to/110tscA\n Refactoring to Patterns http://amzn.to/Vq5Rj2\n Working Effectively with Legacy Code http://amzn.to/VFFYbn\n Code Complete http://amzn.to/Vq5YLv\n Clean Code http://amzn.to/YjUDI0\n "],"twitterShareUrl":"https://twitter.com/intent/tweet?via=SlideShare\u0026text=Improving+the+Design+of+Existing+Software+by+%40ardalis+%23agile+%23agilesoftwaredevelopment+https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fimproving-the-design-of-existing-software-81246420%2F81246420","type":"presentation","slideDimensions":{"height":540,"width":960},"topReadSlides":[],"user":{"id":"29257027","isFollowing":false,"login":"ardalis","name":"Steven Smith","occupation":"Professional Mentor/Coach/Trainer","organization":"Falafel Software","photo":"https://cdn.slidesharecdn.com/profile-photo-ardalis-48x48.jpg?cb=1586530351","photoExists":true,"shortName":"Steven Smith"},"views":1450},"_nextI18Next":{"initialI18nStore":{"en":{"common":{"ad":{"fallbackText":"Ad for Scribd subscription","label":"Ad","close":"Close Ad","dismiss_in":"Dismiss in","ad_info_title":"Why are you seeing this?","ad_info_description":"We use ads to keep content free and accessible for everyone. You can remove them by \u003c2\u003esigning up\u003c/2\u003e for a SlideShare subscription."},"error":{"favorite_add":"We couldn't add SlideShare to favorites","favorite_remove":"We couldn't remove SlideShare from favorites","follow":"There was a problem following this user","unfollow":"There was a problem un-following this user","save":"Unable to save this item at this time.","remove_save":"We couldn't remove from your saved items"},"header":{"hamburger_menu_aria_label":"Open navigation menu","logo":{"alt":"SlideShare a Scribd company logo","title":"Return to the homepage"},"home":"Home","explore":"Explore","search":{"placeholder":"Search","aria_label":"Search SlideShare","button":"Submit Search"},"upload":"Upload","login":"Login","signup":{"label":"Download free for 30 days","title":"Signup now for a SlideShare account"},"user":{"aria_label":"User Settings","clipboards":"My Clipboards","uploads":"My Uploads","analytics":"Analytics","settings":"Account Settings","support":"Support","logout":"Logout"}},"footer":{"link":{"about":"About","support":"Support","terms":"Terms","privacy":"Privacy","copyright":"Copyright","cookie":"Cookie Preferences","privacyRights":"Do not sell or share my personal information"},"language_selector":{"aria_label":"Change Language","hidden_text":"Current Language"},"copyright":"SlideShare from Scribd","social":{"rss":{"aria_label":"Slideshare on RSS Feed","title":"RSS"},"twitter":{"aria_label":"Slideshare on Twitter","title":"Twitter"}}},"app_notification_banner":{"notification_text":"We've updated our privacy policy.","notification_link_text_desktop":"Click here to review the details.","notification_link_text_mobile":"Tap here to review the details."},"privacy_policy_explicit_opt_in_modal":{"modal_title":"We've updated our privacy policy.","modal_content_paragraph_one":"We’ve updated our privacy policy so that we are compliant with changing global privacy regulations and to provide you with insight into the limited ways in which we use your data.","modal_content_paragraph_two":"You can read the details below. By accepting, you agree to the updated privacy policy.","modal_content_paragraph_three":"Thank you!","modal_action_assertive":"Accept and continue","modal_action":"View updated privacy policy","modal_action_error":"We've encountered a problem, please try again."},"actions":{"addToSaved":"Save for later","all_saved":"All Saved","back":"Back","close":"Close","cancel":"Cancel","save":"Save","saved":"Saved","submit":"Submit","next":"Next","previous":"Previous","removeSaved":"Remove from saved","scrollLeft":"Scroll Left","scrollRight":"Scroll Right","save_to_new_list_success":"Saved to "},"form":{"required":"Required"},"slideshow_card":{"slideshow_type":{"document":"Document","infographic":"Infographic","presentation":"Presentation","documents":"Documents","infographics":"Infographics","presentations":"Presentations","downloads":"Downloads","likes":"Likes"},"slideshow_type_unit":{"presentation":"Slide","document":"Page","infographic":"Page"},"pages_count_one":"{{count}} page","pages_count_other":"{{count}} pages","slides_count_one":"{{count}} slide","slides_count_other":"{{count}} slides","screen_reader_text":"{{title}} by {{author}}","screen_reader_text_extended":"{{title}} by {{author}}, has {{slideCount}} slides with {{viewCount}} views.","view_one":"view","view_other":"views"},"image_alt":{"studying":"Abstract image of a woman sitting on books and studying on a laptop"},"items":{"count_one":"{{count}} item","count_other":"{{count}} items"},"time":{"second_one":"{{count}} second","second_other":"{{count}} seconds"},"timeSince":{"minutes_ago":"{{count}} min. ago","hours_ago_one":"{{count}} hour ago","hours_ago_other":"{{count}} hours ago","days_ago_one":"{{count}} day ago","days_ago_other":"{{count}} days ago","months_ago_one":"{{count}} month ago","months_ago_other":"{{count}} months ago","years_ago_one":"{{count}} year ago","years_ago_other":"{{count}} years ago"},"see_more":"See more","see_less":"See Less","yes":"Yes","no":"No","signup":"Sign Up"},"player":{"actions":{"all_saved":"All Saved","clip":"Clip Slide","copy_text":"Copy text","copy_text_success":"Text copied to clipboard","copy_text_error":"Failed to copy the text. Please try again!","download_presentation":"Download presentation","download_slide":"Download slide","download_document":"Download document","download_page":"Download page","download_now":"Download now","download":"Download","favorite":"Favorite","remove_favorite":"Remove favorite","remove_like":"Remove like","like":"Like","follow":"Follow","unfollow":"Unfollow","more_options":"More options","share":"Share","save_slide":"Save slide","saved":"Saved","remove_from_list":"Remove from list {{listname}}","removed_from_list":"Saved item has been removed from the List","removed_from_list_error":"Could not remove the saved item from list","save_error":"Unable to save this item at this time.","save_to_new_list":"New list","save_to_list":"Save to list {{listname}}","scroll_view":"Scroll view","scroll_view_description":"Vertically scroll through all slides","slideshow_view":"Slideshow view","slideshow_view_description":"View one slide at a time","no_saved_lists":"You don't have any lists created yet."},"ads":{"label":"Ad","skip":"Skip to next slide","skip_countdown":"You can skip to the next slide in","continue_in":"Continue in","change_volume":"Change Volume","download_read_ad_free":"Download to read ad-free","scroll":"Scroll to read more"},"ad_block_interstitial":{"title_1":"Keep SlideShare free —","title_2":"please disable your ad blocker.","button_label":"Show me how","message":"Hate ads? Join Scribd to browse SlideShare and Scribd ad-free.","cta":"Try Scribd for free"},"author":{"by":"by","follow":"Follow","following":"Following","keynoteAuthor":"Keynote Author"},"download":{"success":"Your SlideShare is downloading."},"editors_notes":"Editor's Notes","end_of_reading":{"loading":"Loading in","title":"Check these out next","next_slideshares":"Next SlideShares","upcoming_slideshare":"Upcoming SlideShare"},"first_clip":{"title":"You just clipped your first slide!","description":"Clipping is a handy way to collect important slides you want to go back to later. Now customize the name of a clipboard to store your clips."},"metadata":{"at":"at","aiTag":{"descriptionLabel":"AI-enhanced description","descriptionTooltipTitle":"AI-Enhanced Description","descriptionTooltip":"Leveraging AI technology, we've optimized the description for improved clarity.","titleLabel":"AI-enhanced title","titleTooltipTitle":"AI-Enhanced Title","titleTooltip":"Leveraging AI technology, we've optimized the title for improved clarity.","titleAndDescriptionLabel":"AI-enhanced title and description","titleAndDescriptionTooltipTitle":"AI-Enhanced Title and Description","titleAndDescriptionTooltip":"Leveraging AI technology, we've optimized the title and description for improved clarity."},"download":{"bottomSheetTitle":"Download format","label_short":"Download","label":"Download now","description":"Download to read offline","download_count":"Downloaded {{count}} times"},"download_as":"Download as {{formatTypes}}","free_download":"Free Download","readMore":"Read more","readLess":"Read less","more":"more","category":{"label":"Category","description":"View the featured presentations, documents and infographics in the"},"dateFormat":"MMM. D, YYYY","most_read":"Most read","pages":"Pages","page":"Page"},"navigation":{"next_slide":"Next Slide","previous_slide":"Previous Slide","slide_count_of_total_count":"\u003cspan data-cy='current-slide-number' class='current-slide-number j-current-slide'\u003e{{slideCount}}\u003c/span\u003e of \u003cspan class='total-slides j-total-slides'\u003e{{totalCount}}\u003c/span\u003e","view_fullscreen":"View Fullscreen","zoom_in":"Zoom In","zoom_out":"Zoom Out"},"new_clipboard_modal":{"title":"Create a clipboard","name":{"label":"Name","placeholder":"Best of Slides","error":"Name cannot be blank"},"description":{"label":"Description","placeholder":"Add a brief description so other know what your clipboard is about."},"visibility":{"label":"Visibility","description":"Others can see my Clipboard"}},"select_clipboard_modal":{"title":"Select a clipboard","message":"Looks like you've already clipped this slide","button":"Create a clipboard"},"share":"Share SlideShare","rec":{"related":"Related slideshows","recommended_for_you":"Recommended for you","descTooltipTitle":"About the slideshow","recommended":{"title":"Recommended","shortTitle":"Recommended"},"relatedContent":{"title":"More Related Content","shortTitle":"More Related Content"},"featured":{"title":"Featured","shortTitle":"Featured"},"forYou":{"title":"Slideshows for you","shortTitle":"Slideshows for you"},"alsoLiked":{"title":"Viewers also liked","shortTitle":"Viewers also liked"},"latest":{"title":"Recently uploaded","shortTitle":"Recently uploaded"},"moreFromUser":{"title":"More from {{name}}","shortTitle":"More from uploader"},"similarTo":{"title":"Similar to {{title}}","shortTitle":"Similar to"},"whatsHot":{"title":"What's hot","shortTitle":"What's hot"}},"scribd":{"books":{"label":"Ebook","title":"Related Books"},"audioBooks":{"label":"Audiobook","title":"Related Audiobooks"},"error":{"title":"Oops! Something went wrong.","description":"We're sorry, but we can't find any related content at this time.","button":"Try again"},"freeWithTrial":"Free with a 30 day trial from {{brand}}","viewAll":"View All"},"error":{"clipboard":"We couldn't create your clipboard","save":"We couldn't save this item","unsave":"We couldn't remove from your saved items","blocked":"This user has blocked you","private_content":"Private content!","privacy_explanation":"This content has been marked as private by the uploader.","enter_password":"Enter password","file_protected":"This file is password protected.","password_incorrect":"The password is incorrect.","private_presentation":"Private Presentation","private_content_message":"This uploaded file has been marked private by the author. Sorry!","removed_content_title":"Uploaded Content Removed","removed_content_message":"The uploaded content has been removed and is no longer available.","redirect_message":"Redirecting to the homepage in","something_went_wrong_title":"Sorry! The page could not be loaded.","something_went_wrong_message":"This is probably a temporary error. Just refresh the page and retry. If the problem continues, please check back in 5-10 minutes.","not_found_title":"Sorry! We could not find what you were looking for.","not_found_message":"Don't worry, we will help you get to the right place. Are you looking for:"},"save_to_new_list_modal":{"title":"Add to a new list","list_name_input_label":"What would you like to name this list?","list_privacy_label":"Make list private","cancel_button_label":"Cancel","save_list_button_label":"Save","success":"Saved to ","error":"We couldn't save this item to {{listname}}"},"confirm_remove_save_modal":{"title":"This saved item is also in a list.","description":"Removing from saved will also delete the item from your lists","cancel_button_label":"Cancel","delete_button_label":"Delete"},"seo_metadata_test":{"description_suffix":"Download as a PDF or view online for free"}},"metadata":{"gallery_view":"Gallery","gallery_view_label":"Gallery View","like_one":"like","like_other":"likes","likeWithCount_one":"{{count}} like","likeWithCount_other":"{{count}} likes","view_one":"view","view_other":"views","saved_one":"saved","saved_other":"saved","from_embeds":"From embeds","number_of_embeds":"Number of embeds","on_slideshare":"On Slideshare","total_views":"Total views","split_char":",","decimal_point":".","show_more":"Show More","likes":{"empty_message":"Be the first to like this","loading_message":"Loading..."},"slide_one":"slide","slide_other":"slides","slide_count_of_total":"of"},"report":{"more":"More options","share":"Share","report":"Report","edit":"Edit","viewAnalytics":"View Analytics","flag_as_inappropriate":"Report as inappropriate","error":"There was an error while reporting this slideshow. Please try again.","flag":"Flag","copyright_complaint":"Copyright Complaint","select_a_reason":"Select a reason","select_your_reason":"Select your reason for reporting this presentation as inappropriate.","none":"None","porn":"Pornographic","defamatory":"Defamatory","ultraviolence":"Extremely Violent or Promotes Terrorism","hate_speech":"Hate Speech","offensive":"Offensive Language or Threatening","spam":"Spam or Scam","form":{"title":"Report content","description":"If you are the copyright owner of this document and want to report it, please visit the \u003cCustomLink href='example.com'\u003ecopyright infringement notice page\u003c/CustomLink\u003e to submit a report.","error_category":"Select a category to submit your report","error_subtype":"Select a sub-category to submit your report","default_subtype":"Select an option...","category":{"illegal":{"label":"Illegal","description":"Content that breaks the law or promotes illegal activities.","subtypes":{"child_exploitation":"Minor Exploitation","child_sexual_abuse_material":"Child Sexual Abuse","dangerous_products_or_services":"Dangerous Products/Services","non_violent_crime":"Non-Violent Offenses","sex_related_crime":"Sexual Offenses","violent_crime":"Violent Offenses","terrorism":"Terrorism","general":"Other"}},"explicit":{"label":"Explicit","description":"Content that is graphic, offensive, or disturbing.","subtypes":{"sexually_explicit_content":"Sexually Explicit","shocking_content":"Shocking or Disturbing","general":"Other"}},"dangerous_and_deragatory":{"label":"Dangerous \u0026 Derogatory","description":"Content that encourages harmful, threatening, or hateful behavior.","subtypes":{"menacing":"Threatening Behavior","incitement":"Inciting Violence or Hatred","self_harm":"Self-harm","general":"Other"}},"deceptive_and_fraudulent":{"label":"Deceptive \u0026 Fraudulent","description":"Content that intentionally misleads, deceives, or engages in fraudulent activities.","subtypes":{"academic_integrity":"Academic Dishonesty","misinformation":"Spreading False Information","general":"Other"}},"guideline_ignoring":{"label":"Intellectual Property","description":"Content that uses someone else's protected work without permission.","subtypes":{"ip_infringement_copyright":"IP infringement (copyright)","ip_infringement_non_copyright":"IP infringement (non-copyright)","general":"Other"}},"privacy":{"label":"Privacy","description":"Content that misuses personal information.","subtypes":{"privacy_general":"General Privacy","privacy_child":"Child Privacy"}},"spam":{"label":"Spam","description":"Unsolicited and repetitive content that disrupts your experience."},"low_quality":{"label":"Low Quality","description":"Content that fails to meet minimum standards for clarity, relevance, or completeness."}}}},"share_modal":{"close":"Close","embed_title":"Embed","embed_size":"Size (px)","link":"Link","start":"Start on","title":"Share this SlideShare","share_facebook":"Share on Facebook","share_linkedin":"Share on Linkedin","share_twitter":"Tweet on Twitter"},"next_slideshow":{}}},"initialLocale":"en","ns":["common","player","metadata","report","share_modal","next_slideshow"],"userConfig":null},"_sentryTraceData":"b9fa8688ae5a4414bc29dfaecfe427e5-ac3cbdaaac4d6949-1","_sentryBaggage":"sentry-environment=production,sentry-public_key=7e7cafa2920448ed81ac67de08abbeed,sentry-trace_id=b9fa8688ae5a4414bc29dfaecfe427e5,sentry-sample_rate=1,sentry-transaction=%2Fslideshow%2F%5Btitle%5D%2F%5Bid%5D,sentry-sampled=true"},"__N_SSP":true},"page":"/slideshow/[title]/[id]","query":{"title":"improving-the-design-of-existing-software-81246420","id":"81246420"},"buildId":"c2d26bae6c4ddd627835d4a0b06e445f4baa0ea6","assetPrefix":"https://public.slidesharecdn.com","runtimeConfig":{"assetPrefix":"https://public.slidesharecdn.com"},"isFallback":false,"isExperimentalCompile":false,"gssp":true,"locale":"en","locales":["en","de","es","pt","fr"],"defaultLocale":"en","domainLocales":[{"domain":"www.slideshare.net","defaultLocale":"en"},{"domain":"de.slideshare.net","defaultLocale":"de"},{"domain":"es.slideshare.net","defaultLocale":"es"},{"domain":"pt.slideshare.net","defaultLocale":"pt"},{"domain":"fr.slideshare.net","defaultLocale":"fr"}],"scriptLoader":[]}</script></body></html>