Skip to main content

Procedural Programming with one while and switch cases

A well known folk theorem in computer science is that any program can be transformed into a semantically equivalent program of one procedure containing one switch statement inside a while loop. The transformation involves rewriting the program so that each case of the switch is an elementary operation of the original program followed by an assignment to a program counter variable that communicates to the switch statement the next operation to execute. The while loop terminates when the program counter reaches the last operation in the program.
Well in production code nobody will opt for this style, but I think there might be a case where this could come in handy. Few times there is a use case where we have to generate some unique id based on the customer attributes.  This could used as slug for pretty urls, pseudo-username etc. Recently I had to write a stored procedure (PL/SQL) in Oracle to generate pseudo-usernames for some million email accounts that we had, with usual rules of length and uniqueness. Instead of writing multiple if-else blocks I came up with something like this.

capture

Without making a myriad of  if-else nested conditions, I simply wrote a while with condition that checks if pseudo-username generated is within acceptable norms or not. IF yes then program terminates there returning the uniqId created. Else program continues to go on to case statement for next set of steps to generate a psuedo-username. Key thing to note here is that there is a counter maintain which actually determines the which case statement would be picked in each iteration.
Interesting read : This technique has also been used to produce obfuscated C code that produces popular "Twelve Days of Christmas" poem.

Comments

Popular posts from this blog

Guide : Spring Boot with Apache CXF for REST services

In this series of guide, we are going to explore writing REST services with Apache CXF using Spring Boot. The project is build using maven. I assume that you already know how to use maven. Step 1 : Adding dependencies for Spring Boot By default you have to inherit the parent pom of spring boot, but that cannot be followed everytime, so I use an alternative to that. I basically add spring boot pom as dependency so that it brings all the dependencies. <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.version>1.4.3.RELEASE</spring.version> <cxf.version>3.1.10</cxf.version> </properties> <dependencies> <dependency> <!-- Alternative to inheriting from parent spring pom --> <groupId>org.springframework.boot...

Resource Pooling

Requirements for Resource Pool: Allow threads to access resources concurrently Should block threads if no resource is available at the moment Maintain a pool of initialized resources to allow reuse and avoid costly initialization of resources Classes from java.util.concurrent package that will be used: ConcurrentLinkedQueue - An unbounded thread-safe queue. This collection is ideal to act as container of resources since it provides concurrent non blocking access to its elements. Semaphore - Semaphore maintains a set of permits by having a counter. This can be used to acquire or release a permit. If no permits are available then acquire() blocks the invoking thread. Implementation Code reference on github: Resource Pooling

DIY Testing Portal

Introduction A simple portal for tracking testing reports, bugs found and then mapping all this way back to features and releases. However JIRA and other such project management tools provide the features that are mentioned in this document but still this solution can come in handy for those who don't want an outside tool rather a quick dirty solution. Note this is for a general solution overview and focuses more on data modelling. Any installation and setup related findings is homework for reader :) What all is compassed in testing ? Testing Report Bugs Releases Features Test cases Environment What all do you need to see in a testing dashboard ? Timeline of all testing that has happened till date Individual testing report Test cases, which cases map to which feature(s) Testing cycles for a specific release Bugs introduced in a release, mapped to which feature(s) The portal solution involves : Mongodb Mongodb Compass - mongodb dashboard tool Elas...