<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code Organization &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/code-organization/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Tue, 21 Apr 2026 18:11:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Your Framework, Your Rules: Why I Use Extends for Everything</title>
		<link>https://blog.xojo.com/2026/03/17/your-framework-your-rules-why-i-use-extends-for-everything/</link>
		
		<dc:creator><![CDATA[Gabriel Ludosanu]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Code Organization]]></category>
		<category><![CDATA[Extends]]></category>
		<category><![CDATA[Extension Methods]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15904</guid>

					<description><![CDATA[Over the weekend, I was deep into a side project, parsing a massive server log dump. Strings were everywhere: timestamps were mangled, JSON blobs were&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Over the weekend, I was deep into a side project, parsing a massive server log dump. Strings were everywhere: timestamps were mangled, JSON blobs were half-broken&#8230;I kept writing these clunky utility calls, nesting functions inside functions, my code was turning into a sideways pyramid of parentheses.</p>



<p>Then I remembered&nbsp;<code>Extends</code>.</p>



<p>It&#8217;s one of those features that sits quietly in the language. But once it clicks, it changes how you think about utility code entirely. Using Extends, within twenty minutes, my nested mess became readable.</p>



<h2 class="wp-block-heading" id="the-moment-it-clicks">Extends Methods in Practice</h2>



<p>You know the feeling. You&#8217;re writing&nbsp;<code>ParseLogEntry(rawLine)</code>&nbsp;for the hundredth time, and something feels off. The function works. It&#8217;s in your Utilities module (maybe part of a Library?). But every time you call it, there&#8217;s this tiny friction. Why doesn&#8217;t String just&nbsp;<em>know</em>&nbsp;how to parse itself into a log entry? That&#8217;s what&nbsp;<code>Extends</code>&nbsp;fixes.</p>



<p>It lets you teach existing classes new tricks. You write a method in a module, tag the first parameter with&nbsp;<code>Extends</code>, and suddenly&nbsp;<code>String</code>,&nbsp;<code>DateTime</code>,&nbsp;<code>Dictionary</code>&nbsp;(whatever you need) behaves like it always had that method. No subclassing. No wrapper classes. Just the framework, extended to fit&nbsp;<em>your</em>&nbsp;brain.</p>



<h2 class="wp-block-heading" id="why-it-matters">Reading The Code</h2>



<p>Code is read far more than it&#8217;s written. We both know this. But we still write code that reads backwards.</p>



<pre class="wp-block-code"><code>// The old way
Var result As DateTime = ExtractTimestamp(CleanLogEntry(rawLine))

// With Extends
Var result As DateTime = rawLine.CleanLogEntry.ExtractTimestamp</code></pre>



<p>When you&#8217;re debugging at 2 AM, tracing logic through nested function calls is the last thing you want. Extension methods turn that horizontal scan into a vertical one. </p>



<h2 class="wp-block-heading" id="when-i-reach-for-it">When Extends is Exactly Right</h2>



<p>I don&#8217;t use&nbsp;<code>Extends</code>&nbsp;for everything; it&#8217;s not a replacement for proper inheritance or composition. But there are specific moments when it&#8217;s exactly right.</p>



<p><strong>Built-in types that need one more method.</strong>&nbsp;For my log parser, I needed to extract timestamps, clean junk characters, and pull out ISO dates. So, I extended the String class with my custom utilities and made it feel native.</p>



<p><strong>Framework classes you can&#8217;t touch.</strong>&nbsp;You can&#8217;t subclass everything, but <code>Extends</code> can work around things like things third-party plugins, legacy code.</p>



<p><strong>APIs you wish existed.</strong>&nbsp;I&#8217;ve lost count of how many times I&#8217;ve wanted a property or method on a framework class that just isn&#8217;t there.&nbsp;<code>Extends</code>&nbsp;lets me do just that.</p>



<p>For practical examples like email validation, URL validation, and dictionary helpers, check out this&nbsp;<a href="https://blog.xojo.com/2020/06/03/using-class-extensions-to-validate-email-and-url-data/">article</a>&nbsp;that walks you through real implementations. If you want code you can copy into your project today, it&#8217;s a good place to start.</p>



<h2 class="wp-block-heading" id="a-few-gotchas">A Few Things To Keep In Mind</h2>



<p><strong>Nil doesn&#8217;t forgive.</strong>&nbsp;Call an extension on a Nil object and you&#8217;ll get a&nbsp;<code>NilObjectException</code>&nbsp;before your method even runs. The extension sits on the right side of the dot. That object needs to exist.</p>



<p><strong>No override.</strong>&nbsp;You can&#8217;t replace built-in methods. If you try creating an extension with the same name as an existing method, the compiler will use the original. That&#8217;s a good thing; it means you can&#8217;t accidentally break framework behavior.</p>



<p><strong>No properties.</strong>&nbsp;Extensions add behavior, not state. If you need to store data, you still need a subclass or a wrapper.</p>



<p><strong>Stay organized.</strong>&nbsp;Put extensions in well-named modules like&nbsp;<code>LogParsingExtensions</code>&nbsp;or&nbsp;<code>StringHelpers</code>. Six months from now, you&#8217;ll want to know where that&nbsp;<code>.ExtractTimestamp</code>&nbsp;method came from.</p>



<p><strong>Dependencies can hide.</strong>&nbsp;Extension methods live in modules and behave like native methods, so it&#8217;s not always obvious which module a class depends on. Good naming helps.</p>



<h2 class="wp-block-heading" id="try-it">Trying Extends</h2>



<p>If you&#8217;ve never written an extension method, take five minutes. Add a module to your project and create a method like this:</p>



<pre class="wp-block-code"><code>Public Function ExtractFirstISODate(<strong>Extends source As String</strong>) As DateTime
  Var rx As New RegEx
  rx.SearchPattern = "(\d{4}-\d{2}-\d{2})&#91;Tt]?(\d{2}:\d{2}:\d{2})"
  
  Var match As RegExMatch = rx.Search(source)
  If match &lt;&gt; Nil And match.SubExpressionCount &gt; 1 Then
    Var datePart As String = match.SubExpressionString(1)
    Var timePart As String = match.SubExpressionString(2)
    Var isoString As String = datePart + " " + timePart
    
    Try
      Return DateTime.FromString(isoString)
    Catch err As RuntimeException
      Return Nil
    End Try
  End If
  Return Nil
End Function</code></pre>



<p>Now you can call it directly on any string:</p>



<pre class="wp-block-code"><code>Var logLine As String = "&#91;2025-08-14T14:32:15] ERROR: Connection timeout"

Var timestamp As DateTime = logLine.<strong>ExtractFirstISODate</strong>

If timestamp &lt;&gt; Nil Then
  MessageBox("Found timestamp: " + timestamp.ToString)
Else
  MessageBox("No valid timestamp found")
End If</code></pre>



<p>That&#8217;s it. No utility class to instantiate. No module name to remember. Just&nbsp;<code>stringVar.ExtractFirstISODate</code>.</p>



<p>For more complete examples, check out the <a href="https://documentation.xojo.com/getting_started/using_the_xojo_language/modules.html#getting-started-using-the-xojo-language-modules-extension-methods" target="_blank" rel="noreferrer noopener">Extension Methods topic</a> in the Xojo Documentation as well as the <a href="https://forum.xojo.com/c/code-sharing/62" data-type="link" data-id="https://forum.xojo.com/c/code-sharing/62" target="_blank" rel="noreferrer noopener">Code Sharing Forum</a>.</p>



<p><em>Gabriel is a digital marketing enthusiast who loves coding with Xojo to create cool software tools for any platform. He is always eager to learn and share new ideas!</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
