<?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>BBProject.net &#187; overload</title>
	<atom:link href="http://www.bbproject.net/tag/overload/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bbproject.net</link>
	<description>Programowanie, webmastering, informatyka</description>
	<lastBuildDate>Tue, 01 Mar 2011 20:35:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Operator trójargumentowy w Delphi</title>
		<link>http://www.bbproject.net/2010/04/operator-trojargumentowy-w-delphi/</link>
		<comments>http://www.bbproject.net/2010/04/operator-trojargumentowy-w-delphi/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 12:46:35 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[instrukcja warunkowa]]></category>
		<category><![CDATA[operator]]></category>
		<category><![CDATA[overload]]></category>
		<category><![CDATA[przeciążenie]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=212</guid>
		<description><![CDATA[W PHP funkcjonuje coś takiego jak operator trójargumentowy. Jest to składnia języka, pozwalająca na zastąpienie pojedynczego bloku if&#8230;else w bardziej przejrzysty sposób: warunek ? jeśli_prawda : jeśli_fałsz Przykładowo: $zmienna = $k &#62;= 0 ? 'dodatnie' : 'ujemne'; &#8230;odpowiada konstrukcji: if ($k &#62;= 0) {   $zmienna = 'dodatnie'; } else {   $zmienna = 'ujemne'; [...]]]></description>
			<content:encoded><![CDATA[<p>W PHP funkcjonuje coś takiego jak operator trójargumentowy. Jest to składnia języka, pozwalająca na zastąpienie pojedynczego bloku <em>if&#8230;else</em> w bardziej przejrzysty sposób:</p>
<pre>warunek ? jeśli_prawda : jeśli_fałsz</pre>
<p>Przykładowo:</p>
<pre class="brush: php">$zmienna = $k &gt;= 0 ? 'dodatnie' : 'ujemne';</pre>
<p>&#8230;odpowiada konstrukcji:</p>
<pre class="brush: php">if ($k &gt;= 0)
{
  $zmienna = 'dodatnie';
}
else
{
  $zmienna = 'ujemne';
}</pre>
<p>Jak widać uproszczenie jest znaczne. Object Pascal (Delphi) nie posiada niestety operatora trójargumentowego. W tym wpisie pokażę jak zastąpić tą funkcjonalność przy pomocy prostej funkcji i jej <a href="http://pl.wikipedia.org/wiki/Przeci%C4%85%C5%BCanie_funkcji">przeciążenia</a>.</p>
<p><span id="more-212"></span>Zasadniczo, naszym zadaniem będzie stworzenie funkcji o 3 argumentach, która będzie odpowiednikiem operatora trójargumentowego. Jako iż nie jest to skomplikowane zadanie, przystąpmy do działania:</p>
<pre class="brush: delphi">function IfThen(Condition: Boolean; const TrueValue: String; const FalseValue: String): String;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;</pre>
<p>Funkcję tę nazwałem <em>IfThen</em>, gdyż jest to w zasadzie skrót konstrukcji <em>if&#8230;then&#8230;else</em>. Pierwszym parametrem jest warunek, kolejnym zwracana wartość w przypadku spełnienia owego warunku i ostatnim, wartość w przypadku fałszu.</p>
<p>Jak możemy zauważyć, funkcja dedykowana jest jedynie dla argumentów będących ciągiem znaków. Korzystając z dyrektywy <em>overload</em>, stwórzmy przeciążone funkcje dostosowane do wielu różnych typów zmiennych. Całość, umieściłem od razu w osobnym module w celu łatwiejszego, późniejszego wykorzystania napisanych funkcji.</p>
<pre class="brush: delphi">unit TripleOperator;

interface

function IfThen(Condition: Boolean; TrueValue, FalseValue: Byte): Byte; overload;
function IfThen(Condition: Boolean; TrueValue, FalseValue: Integer): Integer; overload;
function IfThen(Condition: Boolean; TrueValue, FalseValue: Single): Single; overload;
function IfThen(Condition: Boolean; TrueValue, FalseValue: Double): Double; overload;
function IfThen(Condition: Boolean; const TrueValue: String; const FalseValue: String): String; overload;

implementation

function IfThen(Condition: Boolean; TrueValue, FalseValue: Byte): Byte;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; TrueValue, FalseValue: Integer): Integer;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; TrueValue, FalseValue: Single): Single;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; TrueValue, FalseValue: Double): Double;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

function IfThen(Condition: Boolean; const TrueValue: String; const FalseValue: String): String;
begin
  if Condition then Result := TrueValue else Result := FalseValue;
end;

end.
</pre>
<p style="text-align: right;">Pobierz <a href="http://www.bbproject.net/wp-content/uploads/2010/01/triple_operator.zip">TripleOperator.pas</a>.</p>
<p>Tym sposobem, zrealizowaliśmy operator trójargumentowy w Delphi dla kilku typów zmiennych. Jak widać, bardzo łatwo można dodać kolejne. Przykładowe użycie funkcji <em>IfThen</em>:</p>
<pre class="brush: delphi">procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := IfThen(Top &lt;= 200, 'okno jest nisko', 'okno jest wysoko');
end;</pre>
<p>Niestety są pewne kruczki w stosunku do wersji w PHP. Po pierwsze, jest to funkcja a nie składnia języka &#8211; ciut mniejsza wydajność. Po drugie, w przypadku spełnienia warunku, oba argumenty muszą zostać przekazane do funkcji, a nie tylko ten odpowiedzialny za prawdę. Innymi słowy, jeśli argumentami są wyniki działań innych funkcji, to bez względu na wynik parametru <em>Condition</em>, i tak obie zostaną wykonane, mimo że zwrócona zostanie tylko jedna z nich. Nie posiada tego mankamentu konstrukcja <em>if&#8230;then&#8230;else</em>, gdzie po wykonaniu pierwszej instrukcji, blok <em>else</em> w ogóle nie jest analizowany. W zależności od wykorzystania, może to nie mieć znaczenia lub mieć bardzo duże. Przykładowo:</p>
<pre class="brush: delphi">Count := IfThen(i = 0, 8, 8 div i);</pre>
<p>Taki przypadek, w sytuacji gdy zmienna <em>i</em> przyjmuje wartość 0, spowoduje niestety błąd.</p>
<p>Wszystko więc zależy od zastosowania, nie mniej, w większości przypadków skraca nam to ilość kodu jaki musielibyśmy napisać tradycyjnie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/04/operator-trojargumentowy-w-delphi/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

