Let me tell you something. You don't have to say anything, you know why? Cause you can pick up all your stuff, because you're mother-fucking fired! | Lemeno.se - En blogg om att Tjäna Pengar På Internet | Min blogg om styrketräning och kost
Programmeringsdesign, PHP
Visa signatur
Det är alltid svårt att uttrycka sig kärnfullt men ändå klart när det gäller programmering tycker jag.
Egentligen är det jag försöker komma undan en följande konstruktion med upprepade if-satser:
class Ad {
public $adState = 'active';
}
class AdWriter {
public function displayAd(Ad $ad, $viewmode = 'visitor') {
if ($viewmode =='visitor') {
if ($adState == 'active') {}
else if ($adState == 'paused') {}
else if ($adState == 'inactive') {}
}
else if ($viewmode = 'owner') {
if ($adState == 'active') {}
else if ($adState == 'paused') {}
else if ($adState == 'inactive') {}
}
else if ($viewmode == 'administrator') {
if ($adState == 'active') {}
else if ($adState == 'paused') {}
else if ($adState == 'inactive') {}
}
}
}
Går det att komma undan på något sätt? Visserligen visar alla varianterna av if-satserna olika saker, men som tidigare nämnt känns det som att det går att lösa på ett snyggare sätt.
Visa signatur
Let me tell you something. You don't have to say anything, you know why? Cause you can pick up all your stuff, because you're mother-fucking fired! | Lemeno.se - En blogg om att Tjäna Pengar På Internet | Min blogg om styrketräning och kost
Citera flera
Citera
Här är ett exempel på hur du undviker upprepade if/else. Tycker switch blir lite tydligare i exemplet men den fungerar egentligen som if/else så det är inte direkt någon superfördel.
class ad{
const active = 1;
const paused = 2;
const inactive = 3;
const visitor = 1;
const owner = 2;
const administrator = 3;
public $adState = self::active;
}
class AdWrite{
function displayAd(Ad $ad, $viewmode = ad::visitor)
{
switch($viewmode){
case ad::visitor:
$this->view_visitor_stuff($ad);
break;
case ad::owner;
$this->view_owner_stuff($ad);
break;
case ad::administrator;
$this->view_admin_stuff($ad);
break;
default:
throw new exception("Incorrect viewmode");
break;
}
$this->common_ad_view($ad);
}
function view_administrator_stuff(Ad $ad){
/* Ex. en header med lite länkar till "edit ad", "remove ad", "view users other ads", osv. */
echo $ad->some_adminspecific_options;
}
function view_owner_stuff(Ad $ad){
/* Ex. lite "view other ads I own", "edit this ad", etc. */
echo $ad->owner_stuff;
}
function view_visitor_stuff(Ad $ad){
/* Kanske inte så mycket som en besökare ser som ingen annan ser... */
}
function common_ad_view(Ad $ad){
/* Relevant för alla, ex. hur reklamen ser/såg ut */
echo $ad->stuff_common_for_all_ads;
}
}
Men det verkar ju som att du har massa typiska if/else-grejer så det kan bli svårt att undvika. Du måste förr eller senare handskas med "Om det är en besökare, visa det här. Om det är admin, visa det här!" Om du väljer att göra det med olika funktioner som i mitt exempel, eller i en view-funktion typ:
function view(Ad $ad, $viewmode){
if($viewmode == ad::administrator){
echo "Stäng av användarens reklam";
}elseif($viewmode == ad::owner){
echo "Ta bort reklam";
}elseif($viewmode == ad::visitor){
/* Kommer inte på något exempel */
}
echo $ad->some_ad_property;
}
Är nog lite upp till hur du tycker känns enklast. En stor view-funktion blir snabbt krånglig att underhålla.
Ett annat alternativ är att ex. ge "Ad" en egen "access-mode" och __get funktion, ex:
class ad{
/* Samma consts som ovan */
private $access;
private $adproperties;
function set_access($new_access){
switch($new_access){
case self::administrator:
$this->access = self::administrator;
break;
/* Samma som ovan och exception på default */
}
}
function __get($name){
$owner_properties = array("some_owner_key");
$admin_properties = array("ad_database_id", "other_admin_keys");
if(array_key_exists($name, $this->adproperties){
if(in_array($name, $owner_properties))
{
if($this->access === self::owner || $this->access === self::administrator)
{
return $this->adproperties[$name];
}else{
/* Exception eller false, beroende på hur du väljer att använda funktionen kanske */
throw new exception("Insufficient rights");
}
}
elseif(in_array($name, $admin_properties)){
if($this->access === self::administrator)
{
return $this->adproperties[$name];
}/*Else some ovan */
}
return $this->adproperteis[$name];
}else{
throw new exception("Incorrect name");
}
}
}
Funktionen ovan går bra med en gemensam view_ad funktion i AdWrite för då kan du jämföra med false eller köra try/catch-block så går den igenom allt automatiskt.
Abstraction ftw, fast nu ska jag inte flumma mer!
Visa signatur
Cat funeral! Cat funeral!
>>> 112383 <<<
Citera flera
Citera
Hårdvara
- Idag Sony läcker uppgifter i rättegång – så stort är Call of Duty 9
- Igår Nvidia: "Energieffektiva RTX 4060 sparar hundralappar" 37
- Igår MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare 46
- Igår Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer 15
- Igår Nvidias nästa arkitektur för Geforce kommer år 2025 58
Mjukvara
Övrigt
- Igår Veckans fråga: Vilket operativsystem föredrar du? 83
- Igår Bilar med smarta inslag ger fler dumma fel 63
- 27 / 6 Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år" 88
- 26 / 6 Lastpass-användare rasar – kan inte logga in 59
- 26 / 6 Inet frågar SweClockers – Vad skulle du vilja förbättra på Inet.se? 53
Datorkomponenter
Ljud, bild och kommunikation
- Framtiden för C# och .Net i Sverige47
- Mekaniska tangentbord och tillbehör, allmän diskussion och frågor.6379
- Elbilar - Tråden för intresserade20459
- Strul med win 11 (och StartAllBack?)9
- iMac visar inte innehåller i extern HDD5
- Borra i betongvägg60
- Skulle behöva lite hjälp med val av utbildning!19
- Föra över mini DV till datorn via Firewire DV - USB0
- Köpråd gamingdator, budget ca 25-33k15
- Veckans fråga: Vilket operativsystem föredrar du?83
- Säljes I5 12500
- Säljes LG 27'' UltraGear 27GP950 4K Nano IPS 160 Hz HDMI 2.1
- Säljes Star Wars Jedi AMD kod
- Säljes Trasig Xiaomi Mi Electric Scooter (M365) Svart
- Säljes 5800x3D + x570 Meg Unify + be quiet! Dark Rock Slim
- Säljes AMD ASUS DUAL RX6700XT
- Säljes Dell OptiPlex 7010
- Säljes Datordelar: i5 9600k + 1070 GTX mm.
- Säljes 1080 TI | Vattenblock | 1TB SSD | Apple Watch 4 Stainless | Hörlurar | Mikrofon
- Säljes Intressekoll: Xbox Series S 512Gb samt Switch Oled 64Gb Vit
- Sony läcker uppgifter i rättegång – så stort är Call of Duty12
- Nvidia: "Energieffektiva RTX 4060 sparar hundralappar"37
- MSI Geforce RTX 4060 Ventus 2X OC – bra prestanda vid 1080p men medioker kylare46
- Veckans fråga: Vilket operativsystem föredrar du?83
- Bilar med smarta inslag ger fler dumma fel63
- Noctua släpper monteringsram för "deliddade" Ryzen 7000-processorer15
- Nvidias nästa arkitektur för Geforce kommer år 202558
- Microsoft vill strömma Windows från molnet72
- Starfield utvecklas med AMD:s välsignelse153
- Telekombranschen: "Smarta glasögon ersätter telefoner inom fem år"88
Externa nyheter
Spelnyheter från FZ
- Över tre miljoner exemplar av Final Fantasy XVI har skeppats och sålts idag
- Sony råkar avslöja spelbudgetar och annat på grund av dålig märkpenna idag
- Alan Wake och CoD: Kallt krig snart på PS Plus igår
- Red Dead Redemption åldersmärkt igen i Korea – det spekuleras i remaster igår
- Fallout London flyttas för att slippa Starfield-konkurrensen igår