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 Rykte: Första Zen 5-processorerna släpps i augusti 21
- 25 / 5 Ny USB-sticka håller i 200 år – men det finns en hake 52
- 24 / 5 G.Skill lanserar primärminnen med extra bling 18
- 24 / 5 45 år senare – nu är det ursprungliga konsolkriget över 26
- 23 / 5 Geforce RTX 5090 kan få 512-bitars minnesbuss 71
Mjukvara
- Idag Microsoft avslöjar de verkliga systemkraven för Windows 11 25
- Idag Bungie vinner prejudicerande fall mot fuskutvecklare 27
- Igår Här är funktionerna Microsoft tar bort i Windows 11 24H2 24
- Igår Komplicerat lämna spelbibliotek till arvingar 32
- 25 / 5 ICQ kastar in handduken efter nästan 30 år 104
Datorkomponenter
Ljud, bild och kommunikation
- Tråden om Skägg!266
- Filminstitutets VD vill införa Netflix-skatt46
- Dagens fynd — Diskussionstråden49753
- Portabel AC inför sommaren [Samlingstråd]5063
- Bungie vinner prejudicerande fall mot fuskutvecklare28
- Köpråd dator för spel/amatör-CAD < 50k SEK0
- Försöker gissa vilket spel det är som en sexåring berättar om.5
- Avgoogla ditt liv med Linus Tech Tips45
- UHD Blu-ray, vad köpa?0
- Sur, Ledsen, Galen?! Skriv av er här!21579
- Säljes Dator i delar exkl. Gpu & PSU. 5900x, x570, 360mm AIO bland mera
- Säljes Retrodator - Micro ATX - Compaq EVO D300V
- Säljes Logitech G915 Lightspeed Tactile (Nordisk) Obruten
- Säljes Diverse från garderoben
- Säljes Gamingdator / i5-13600k / 4070 Super / 32gb ddr5 / 1000GB SSD
- Säljes Steam Deck OLED 512GB - nyskick
- Säljes Samsung SSD 870 EVO 2 TB Obruten & 4TB WD Red PRO 4TB
- Säljes Lenovo P15v G3/i7-12800h/14c/20t/Xe-Graphics/2x32GB/QuadroA2000-4GB/PCIeGen4SKHynix512GB/
- Bytes Byter 3070 mot A4000
- Bytes ASRock x570 Steel Legend bytes mot B550
- Håll koll på årets stora hårdvarulanseringar5
- Filminstitutets VD vill införa Netflix-skatt46
- Rykte: Första Zen 5-processorerna släpps i augusti21
- Snabbkoll: Kör du Windows 11?78
- Säkerhetsslarv på Tietoevry: "Ofta var lösenordet admin"45
- Microsoft avslöjar de verkliga systemkraven för Windows 1125
- Bungie vinner prejudicerande fall mot fuskutvecklare28
- Moddare bygger in hel PC i bord17
- Här är funktionerna Microsoft tar bort i Windows 11 24H224
- Komplicerat lämna spelbibliotek till arvingar32