Håller du med om dessa 7 kodtips?

Permalänk
Avstängd

Håller du med om dessa 7 kodtips?

Från en YT-video så framgick följande 7 kodtips:

Citat:

"1. Avoid abbreviating variables (pw => password)
2. Limit function arguments (aim for 3)
3. Simplify conditional expressions
4. Declare variables close to their usage
5. Avoid unintended consequences in functions
6. Functions should do one thing (avoid long functions)
7. Stop writing zombie code"

Om vi ser dessa som "tumregler" och inte "gör alltid/aldrig", i vilken utsträckning håller du med om kodtipsen och vilka möjliga invändningar har du som professionell kodare? Vi utgår också ifrån att "tumreglerna" gäller det professionella kodyrket och inte fallet som t.ex. kodtävlingar där du kanske skall koda nått fantastiskt som bara tar 64 KB som kompilerad exe-fil vilket då kan tvinga fram mer strikt kodning som är mer sällsynt än vanligt i kodbranschen.

T.ex. tips 6 om att låta funktioner() bara ta ett argument/göra en sak tycker jag personligen låter "vettigt" och att det öppnar upp för att kunna lägga till/ta bort flera funktioner() som körs sekventiellt istället. Tänk en funktion() vars ända {}-innehåll är att köra 3 funktioner() och då kan du i denna funktionslista() lägga till, ändra körordning, och/eller ta bort funktioner samtidigt som varje enskild funktion som körs blir lättare att hantera för sig i det stora hela.

Samtidigt så kräver det mer kod (fler funktioner) och fler kommentarer och möjligen kanske det kan upplevas i vissa fall som överflödigt än att bara låta samma funktion ta flera variabler samtidigt för att kanske spara ett formulär eller något dylikt.

Jag frågar för att kunna lära mig tänka rätt redan från början som blivande hobbykodare (ska lära mig koda simpelt CRM-affärssystem med JS/Node(?)/React(?), mongoDB, HTML, CSS för vanliga datorer och smartphones (Kotlin(?))) så att jag inte "installerar" dåliga kodvanor likt en pianospelare som lär sig spela på ett icke-optimalt vis med händerna vilket senare blir en mycket svår inlärd vana att försöka bryta. Liknande tänk med "kodvanor" enligt mig!

Visa signatur

"Företagsboendeförmedlare" | Min Überkill Dator: Processor: Intel Pentium P5 66 Mhz OC | Moderkort: ASRock P4I65G | Minnen: 2st Samsung 128MB PC133 | Grafikkort: Canopus GeForce 256 DDR | Lagring: IBM 350 4,4 MB | Operativsystem: DOS/360 | Chassi: Mercury Full-Tower ATX Chassis |

Permalänk
Medlem

Jag följer punkterna 1-3 och punkt 6 utan att ens ha tittat på YouTube-videon. Kul

De andra punkterna låter vettiga, men kör dom inte.

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem

”DRY” och ”felhantera, på rätt ställe” saknas på listan tycker jag. Det är vanliga nybörjarmisstag.

Om man pysslar med OOP så kommer 2, 4 och 5 i viss mån vara motsägelsefulla, när man ska börja göra icke-triviala saker.

Listan är bra som ambition, men att följa den är knappast en garanti för att man får bättre kod än om man bryter mot den, när det är lämpligt.

Permalänk
Medlem

1. Avoid abbreviating variables (pw => password)
Ja

2. Limit function arguments (aim for 3)
Ja

3. Simplify conditional expressions
Ja

4. Declare variables close to their usage
Nej, beror ju på vilken typ av variabler och vad dom menar med close men inget jag tycker är speciellt viktigt.

5. Avoid unintended consequences in functions
Ja, jag brukar inte medvetet lägga till buggar

6. Functions should do one thing (avoid long functions)
Ja, inom rimliga gränser. Men bra för nybörjare att tänka på detta.
Det viktigaste är att koden är lätt att läsa och förstå.

7. Stop writing zombie code
Ja, versionshanterare är guld värd när man ska rensa gammal kod.

Permalänk

Inget fel på den listan. De flesta punkter är bra att ha i bakhuvudet. Här är ett tillägg eller ett annat sätt att se på saken:

En tumregel jag har är att försöka se mjukvaran som ett nätverk av noder. Om noderna får data från alla möjliga håll och även pillar lite överallt så har man snart bara ett clusterfuck som inte går att göra nånting med.

För min del handlar det mest om 3 saker:
1. Smarta/effektiva lösningar (tänk "problemlösning")
2. Modulär mjukvara (tänk "nätverk av noder")
3. Prydlig och lättläst kod (tänk "underlättar både för mig och för andra")

Permalänk
Medlem

Jag tycker listan var vettig! Sen som någon sa, en genomtänkt felhanteringsstrategi är bra - ofta har man ju minst 2 kategorier "fel". Den ena kanske är "ok" o kan fångas och kompenseras för direkt i funktionen, den andra ska eskaleras vidare.

Annars gillar jag KISS metoden, dvs "keep it simple stupid". Håll koden enkel o tydlig, använd inte onödigt komplexa mönster o lösningar där det inte krävs. Abstrahera på en lagom nivå.

Var konsekvent gällande namnsättning och "pattern" som används.

Var öppen för att förändra ditt mönster när du byter paradigm, t.ex. från MVC -> Blazor Server -> Blazor Webbassembly, varje teknisk lösning har ett mönster som den är gjord för och som ger minst motstånd.

mvh Lazze

Permalänk
Hedersmedlem
Skrivet av mwi:

4. Declare variables close to their usage
Nej, beror ju på vilken typ av variabler och vad dom menar med close men inget jag tycker är speciellt viktigt.

Menar de inte bara att man deklarerar variabler när de behövs ungefär? Äldre c kräver ju att man inleder en funktion med att deklarera alla variabler som kommer att användas och somliga skriver fortfarande så.

Permalänk
Medlem
Skrivet av Elgot:

Menar de inte bara att man deklarerar variabler när de behövs ungefär? Äldre c kräver ju att man inleder en funktion med att deklarera alla variabler som kommer att användas och somliga skriver fortfarande så.

Framförallt så blir de deklarerade i det Scope där de används och nås inte utanför relevanta metoder. (Beroende på språk då givetvis)

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem
Citat:

1. Avoid abbreviating variables (pw => password)

Ja, inom rimliga gränser. Ser vissa som ger sina variabler en hel mening som namn (verkar vanligare bland Javaprogrammerare). Ibland kanske det helt enkelt blir lättare att kalla en variabel för i, j, c eller liknande istället för typ innerLoopCounterVariable.

Citat:

2. Limit function arguments (aim for 3)

Själv tycker jag att det börjar bli svårläsligt med mer än 5, men jag vet att det finns andra som tycker att det förbättrar läsligheten att allting som en funktion behöver skickas som argument.

Citat:

6. Functions should do one thing (avoid long functions)

Det här är någonting som verkligen stör mig. Det gör koden exponentiellt mycket svårare när folk delar upp varenda grej i sin egen funktion så att man behöver hoppa fram och tillbaka hundratals gånger för att ha någon aning om vad som händer.

Varför skriva på följande sätt...

function1(){ //Stuff 1 } function2(){ //Stuff 2 } function3(){ //Stuff 3 } function1(); function2(); function3();

istället för

//Stuff 1 //Stuff 2 //Stuff 3

förutsatt att ovanstående funktioner alltid körs i den följden?

Till exempel ser jag ofta folk som har en funktion som allokerar minne, och sedan en annan funktion som använder det minnet, där de två funktionerna alltid körs i följd och är de enda som använder det minnet. Varför inte allokera minnet i samma funktion som använder det då istället för att dela upp koden i två funktioner och göra den betydligt svårare att följa?

Permalänk
Medlem
Skrivet av TMG:

Ja, inom rimliga gränser. Ser vissa som ger sina variabler en hel mening som namn (verkar vanligare bland Javaprogrammerare). Ibland kanske det helt enkelt blir lättare att kalla en variabel för i, j, c eller liknande istället för typ innerLoopCounterVariable.

Själv tycker jag att det börjar bli svårläsligt med mer än 5, men jag vet att det finns andra som tycker att det förbättrar läsligheten att allting som en funktion behöver skickas som argument.

Det här är någonting som verkligen stör mig. Det gör koden exponentiellt mycket svårare när folk delar upp varenda grej i sin egen funktion så att man behöver hoppa fram och tillbaka hundratals gånger för att ha någon aning om vad som händer.

Varför skriva på följande sätt...

function1(){ //Stuff 1 } function2(){ //Stuff 2 } function3(){ //Stuff 3 } function1(); function2(); function3();

istället för

//Stuff 1 //Stuff 2 //Stuff 3

förutsatt att ovanstående funktioner alltid körs i den följden?

Till exempel ser jag ofta folk som har en funktion som allokerar minne, och sedan en annan funktion som använder det minnet, där de två funktionerna alltid körs i följd och är de enda som använder det minnet. Varför inte allokera minnet i samma funktion som använder det då istället för att dela upp koden i två funktioner och göra den betydligt svårare att följa?

Det blir svårare att återanvända funktioner som gör många saker. Det är mer en fråga om att en funktion ska ha "only one reason to change", d.v.s. ett ansvarsområde.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem

Bra lista generellt, men viktigaste som inte är med är felhantering och möjligheten att koden som använder funktionen se när ett fel har skett och hantera det. Ofta kallar man på olika APIer med mer eller mindre skumma fel som händer ibland, då gäller det att hantera felet på ett vettigt sätt där det uppstår så det är lätt att felsöka och fixa när de senare uppstår. Inbakat med detta brukar det kunna hjälpa att ha bra system för att logga vad som händer, då framförallt när det går fel såklart

Permalänk
Medlem
Skrivet av TMG:

Det här är någonting som verkligen stör mig. Det gör koden exponentiellt mycket svårare när folk delar upp varenda grej i sin egen funktion så att man behöver hoppa fram och tillbaka hundratals gånger för att ha någon aning om vad som händer.

Varför skriva på följande sätt...

function1(){ //Stuff 1 } function2(){ //Stuff 2 } function3(){ //Stuff 3 } function1(); function2(); function3();

istället för

//Stuff 1 //Stuff 2 //Stuff 3

förutsatt att ovanstående funktioner alltid körs i den följden?

Till exempel ser jag ofta folk som har en funktion som allokerar minne, och sedan en annan funktion som använder det minnet, där de två funktionerna alltid körs i följd och är de enda som använder det minnet. Varför inte allokera minnet i samma funktion som använder det då istället för att dela upp koden i två funktioner och göra den betydligt svårare att följa?

På jobbet hittade jag en metod som var 400 rader lång, fick sitta och scrolla flera steg för att försöka begripa vad den gör. Där hade en uppdelning med tydliga funktionsnamn varit mycket mer lättläsligt.

Permalänk
99:e percentilen
Skrivet av TMG:

Det här är någonting som verkligen stör mig. Det gör koden exponentiellt mycket svårare när folk delar upp varenda grej i sin egen funktion så att man behöver hoppa fram och tillbaka hundratals gånger för att ha någon aning om vad som händer.

Varför skriva på följande sätt...

function1(){ //Stuff 1 } function2(){ //Stuff 2 } function3(){ //Stuff 3 } function1(); function2(); function3();

istället för

//Stuff 1 //Stuff 2 //Stuff 3

förutsatt att ovanstående funktioner alltid körs i den följden?

Till exempel ser jag ofta folk som har en funktion som allokerar minne, och sedan en annan funktion som använder det minnet, där de två funktionerna alltid körs i följd och är de enda som använder det minnet. Varför inte allokera minnet i samma funktion som använder det då istället för att dela upp koden i två funktioner och göra den betydligt svårare att följa?

Det sistnämnda låter ju inte rätt, men jag tror ändå att det finns fall då själva uppdelningen i sig kan göra koden mer lättbegriplig och -hanterlig. Till exempel skrev jag nyligen ett Bash-skript, avsett för att göra en kontroll i CI, på följande form:

checkOptions() { # ett par dussin rader } checkActualThing() { # ett par dussin rader } checkOptions checkActualThing

Jag hade lika gärna bara kunnat skriva hela skriptet inline, men jag upplevde att det kändes klart enklare att läsa och underhålla på detta sätt.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
99:e percentilen

Har inte sett videon, men tycker tipsen låter generellt vettiga, bortsett från att nummer 3 inte går att ta ställning till så som det citerats i TS. Vill också påpeka att tips 6 inte säger att funktioner bara ska ta ett (1) argument, eller för den delen någonting om antal argument överhuvudtaget.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av zaibuf:

På jobbet hittade jag en metod som var 400 rader lång, fick sitta och scrolla flera steg för att försöka begripa vad den gör. Där hade en uppdelning med tydliga funktionsnamn varit mycket mer lättläsligt.

I vårt huvudprojekt på jobbet har jag svårt att hitta funktioner med färre än 400 rader :/

Visa signatur

MSI PRO Z790-P WIFI | Intel i9 13900K | 128 GB DDR5
NVIDIA GeForce GTX 4070 12 GB
WD Black SN850X 2 TB Gen 4 | 2 x 1 TB Samsung 970 EVO Plus
3 x ASUS 27" | 1 x Philips 49"

Permalänk
Medlem
Skrivet av Superfrog:

I vårt huvudprojekt på jobbet har jag svårt att hitta funktioner med färre än 400 rader :/

Det är nog ganska vanligt, framförallt med kod som bara körs på ett ställe och är del av någon form av huvudlogik

Permalänk
Medlem
Skrivet av medbor:

Det är nog ganska vanligt, framförallt med kod som bara körs på ett ställe och är del av någon form av huvudlogik

För legacy kod är det vanligt, givetvis noll tester också. För vem kan testa en metod på 400 rader 😜
Personligen tycker jag det är vidrigt, vill inte behöva scrolla i metoden för att följa hela flödet. Koden för en funktion ska få plats på skärmen, max 60 rader.

Jag har som riktlinje runt max 200 rader i en klass, annars börjar klassen bli för komplex och förmodligen göra mer än tänkt.

Permalänk
Medlem
Skrivet av zaibuf:

För legacy kod är det vanligt, givetvis noll tester också. För vem kan testa en metod på 400 rader 😜
Personligen tycker jag det är vidrigt, vill inte behöva scrolla i metoden för att följa hela flödet. Koden för en funktion ska få plats på skärmen, max 60 rader.

Jag har som riktlinje runt max 200 rader i en klass, annars börjar klassen bli för komplex och förmodligen göra mer än tänkt.

I vårt fall handlar det om ett butikssystem/kassaprogram som är skrivet i VB6. Det finns klasser med över 30.000 rader kod. Hela projektet består av över en miljon rader kod. Mycket är förstås copy-pasta-kod.

Men att vissa funktioner är på flera hundra rader är inte så konstigt. Exempelvis komplexa utskriftsfunktioner som ska skriva ut rapporter av olika slag. Vet inte hur dessa funktioner skulle kunna göras mindre.

Tack och lov utvecklar jag funktioner i C# som jag exponerar mot VB6-projektet via COM, så jag behöver inte peta så mycket i VB6-kodbasen

På tal om att scrolla (med mushjulet), så är det inte möjligt i Visual Studio 6 som standard, men tack och lov finns det ett tillägg som gör det möjligt. Inte för att min chef installerat det, men så sitter han kvar i Windows XP också

Och tester... Tror inte det fanns några testprogram á la xUnit etc. på VB6-tiden, så några tester existerar absolut inte.

Visa signatur

MSI PRO Z790-P WIFI | Intel i9 13900K | 128 GB DDR5
NVIDIA GeForce GTX 4070 12 GB
WD Black SN850X 2 TB Gen 4 | 2 x 1 TB Samsung 970 EVO Plus
3 x ASUS 27" | 1 x Philips 49"

Permalänk
Avstängd
Skrivet av medbor:

Bra lista generellt, men viktigaste som inte är med är felhantering och möjligheten att koden som använder funktionen se när ett fel har skett och hantera det. Ofta kallar man på olika APIer med mer eller mindre skumma fel som händer ibland, då gäller det att hantera felet på ett vettigt sätt där det uppstår så det är lätt att felsöka och fixa när de senare uppstår. Inbakat med detta brukar det kunna hjälpa att ha bra system för att logga vad som händer, då framförallt när det går fel såklart

Är det här "else"-satser som returnerar felmeddelande kan vara guld värda när man har hundratals olika funktioner() i ett och samma program? Eller syftar du på något annat när du nämner "se när ett fel har skett och hantera det"?

Visa signatur

"Företagsboendeförmedlare" | Min Überkill Dator: Processor: Intel Pentium P5 66 Mhz OC | Moderkort: ASRock P4I65G | Minnen: 2st Samsung 128MB PC133 | Grafikkort: Canopus GeForce 256 DDR | Lagring: IBM 350 4,4 MB | Operativsystem: DOS/360 | Chassi: Mercury Full-Tower ATX Chassis |

Permalänk
Medlem
Skrivet av AplAy:

Är det här "else"-satser som returnerar felmeddelande kan vara guld värda när man har hundratals olika funktioner() i ett och samma program? Eller syftar du på något annat när du nämner "se när ett fel har skett och hantera det"?

Fånga exceptions och göra dem förståeliga, men också att ha vettiga else satser som loggar eller i alla fall gör något ifall udda fall (även de som inte borde gå) uppstår. Vet inte hur många gånger jsg läst i loggar något i stil med ’wtf - impossible case parameter ’x’ is null after validation’ och liknande rader som exekverats...

Permalänk
Hedersmedlem
Skrivet av zaibuf:

På jobbet hittade jag en metod som var 400 rader lång, fick sitta och scrolla flera steg för att försöka begripa vad den gör. Där hade en uppdelning med tydliga funktionsnamn varit mycket mer lättläsligt.

Jo, men det finns ju en sweet spot där -- och många verkar propagera för att sweetspoten är typ 5-10 rader per funktion.
I mina ögon så är det bättre med en funktion på 50 rader än 5 st på 10 om och bara om den koden inte ska eller kan användas på andra ställen också. Är det något återanvändbart så ska det förstås vara i en funktion och inte repeteras.
Men att skapa dussintals minifunktioner som enbart används i exakt samma ordning ser jag oftare som något negativt än något positivt.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

1. Avoid abbreviating variables (pw => password)
Ja, jag föredrar att undvika förkortningar. Det ökar läsbarhet och med en modern IDE får man ändå autocomplete.

2. Limit function arguments (aim for 3)
Inte något jag jag direkt reflekterar över när jag skriver kod.

3. Simplify conditional expressions
Ja, varför skulle man inte göra det om man kan det?

4. Declare variables close to their usage
Ja.

5. Avoid unintended consequences in functions
ja, återigen - varför skulle man göra annorlunda? edit: antagligen jag som inte fattar vad som menas här.

6. Functions should do one thing (avoid long functions)
Ja. den här är vettig och en vanlig junior synd. Bryt ut och håll funktioner små.

7. Stop writing zombie code
pass, vet inte vad zombie kod är men det låter dåligt.

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | aw3225qf |

Permalänk
Medlem
Skrivet av Thomas:

Jo, men det finns ju en sweet spot där -- och många verkar propagera för att sweetspoten är typ 5-10 rader per funktion.
I mina ögon så är det bättre med en funktion på 50 rader än 5 st på 10 om och bara om den koden inte ska eller kan användas på andra ställen också. Är det något återanvändbart så ska det förstås vara i en funktion och inte repeteras.
Men att skapa dussintals minifunktioner som enbart används i exakt samma ordning ser jag oftare som något negativt än något positivt.

Jag skulle väl säga att det är bra att ha dessa som utgångspunkter när man designar sin kod, men sedan får man vara pragmatisk och "bryta" emot dom när det är lämpligt.

Om du skriver en funktion som du vet är väldigt specifik och vars beståndsdelar inte har någon nytta utanför funktionen så kan det finnas en poäng vid att inte bryta ut till flera små funktioner. Dock finner jag själv att det oftast blir både enklare att läsa koden samt att skriva enhetstester om man istället har flera små funktioner.

Oftast är det inte så intressant exakt hur alla dessa är implementerade och då ger det en bättre överblick när man läser själva huvudfunktionen (förutsatt att funktionerna är bra namngivna).

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Avstängd

Zombie code = kod som ligger kvar genom att de blivit // kommenterar (istället för att nyttja versionskod)

Visa signatur

"Företagsboendeförmedlare" | Min Überkill Dator: Processor: Intel Pentium P5 66 Mhz OC | Moderkort: ASRock P4I65G | Minnen: 2st Samsung 128MB PC133 | Grafikkort: Canopus GeForce 256 DDR | Lagring: IBM 350 4,4 MB | Operativsystem: DOS/360 | Chassi: Mercury Full-Tower ATX Chassis |

Permalänk
99:e percentilen
Skrivet av Ragin Pig:

5. Avoid unintended consequences in functions
ja, återigen - varför skulle man göra annorlunda? edit: antagligen jag som inte fattar vad som menas här.

Möjligen menas att funktioner inte ska ha sidoeffekter som förvånar den som applicerar/anropar funktionen. Till exempel är det ju lätt att lista ut att

async function getDataFromServer(): Promise<Data>

kommer göra en förfrågan till en server eller att

function logWarning(message: string): void

kommer skriva någon form av output, men jag skulle inte förvänta mig att

function isEligible(user: User): boolean

har några sidoeffekter alls (utom möjligen eventuell loggning, beroende på sammanhang).

Skrivet av AplAy:

Zombie code = kod som ligger kvar genom att de blivit // kommenterar (istället för att nyttja versionskod)

Tack för förtydligandet. Skulle aldrig sätta mitt godkännande på en PR som checkar in kommenterad kod, annat än kanske i något väldigt specifikt undantagsfall. Borde vara tvång på att använda git add -p, kan jag känna ibland …

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

Möjligen menas att funktioner inte ska ha sidoeffekter som förvånar den som applicerar/anropar funktionen. Till exempel är det ju lätt att lista ut att

async function getDataFromServer(): Promise<Data>

kommer göra en förfrågan till en server eller att

function logWarning(message: string): void

kommer skriva någon form av output, men jag skulle inte förvänta mig att

function isEligible(user: User): boolean

har några sidoeffekter alls (utom möjligen eventuell loggning, beroende på sammanhang).

Tack för förtydligandet. Skulle aldrig sätta mitt godkännande på en PR som checkar in kommenterad kod, annat än kanske i något väldigt specifikt undantagsfall. Borde vara tvång på att använda git add -p, kan jag känna ibland …

Ja precis, unintended sideffects är ju till exempel om ’isEligible’ skulle göra synkrona anrop mot en server eller skriva data till en databas, eller ändra status på något eller sånt...

Då borde den heta typ ’refreshEligibleState’ eller något istället

Permalänk
Medlem

Vem gillar inte favoriter som.

  • InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState

  • initWithEnableFan:enableAirConditioner:enableClimateControl:enableAutoMode:airCirculationMode:fanSpeedIndex:fanSpeedPercentage:relativeFanSpeedSetting:temperature:relativeTemperatureSetting:climateZone:

  • CMMetadataFormatDescriptionCreateWithMetadataFormatDescriptionAndMetadataSpecifications

  • kCMBufferQueueTrigger_WhenDurationBecomesGreaterThanOrEqualToAndBufferCountBecomesGreaterThan

  • kCMSampleBufferConduitNotificationParameter_UpcomingOutputPTSRangeMayOverlapQueuedOutputPTSRange

  • drawIndexedPatches:patchStart:patchCount:patchIndexBuffer:patchIndexBufferOffset:controlPointIndexBuffer:controlPointIndexBufferOffset:instanceCount:baseInstance:

  • kCMBufferQueueTrigger_WhenDurationBecomesGreaterThanOrEqualToAndBufferCountBecomesGreaterThan