A lot of former mainframe people will tell you that it was a pretty rough transition from the good ole' days of COBOL and VMS to the modern paradigm of Object-Oriented C++/Java/.NET development. Some have stuck around, fighting over the handful of jobs maintaining the remaining systems. Others are still in denial, believing that "minicomputers" are just a fad and that we will soon return to the heyday of mainframes.
A few have actually snuck into our world, trying to undermine and transform it into a world of flat files, and fixed-length strings. Be on the look out for these developers. Fortunately, their M.O. is easy to spot: who can miss UPPR_CSE_EVRYTHNG? But the sure-fire way of telling is to look for a single underlying string for all data storage, such as this code from James Watson's JavaBOL-based system:
public void setCUSTOMER_NBR(String value)
{
final int paddingType = P_RIGHT_SPACE_FILL;
final int offset = 16;
final int length = 6;
String s = padString(value, length, paddingType);
setValue(offset, length, s);
}
public String getCUSTOMER_NBR()
{
final int paddingType = P_RIGHT_SPACE_FILL;
final int offset = 16;
final int length = 6;
String s = getValue(offset, length);
return unpadString(s, paddingType);
}
private String getRawCUSTOMER_NBR()
{
final int offset = 16;
final int length = 6;
return getValue(offset, length);
}
private String getValue(int offset, int length)
{
return data.substring(offset, offset + length);
}
//ED: and the technique for repeating records ...
public int getLINE_NBR(int index1) throws IndexOutOfBoundsException
{
final int paddingType = P_LEFT_ZERO_FILL;
final int offset = 294;
final int length = 3;
int[] indexes = new int[1];
indexes[0] = index1;
ArrayDimensions[] ad = new ArrayDimensions[1];
ad[0] = new ArrayDimensions(75, 96);
String s = getValue(calculateOccursOffset(offset, indexes, ad), length);
return unpadInt(s, paddingType);
}
public static int calculateOccursOffset(int baseOffset, int[] arguments, ArrayDimensions[] ad )
{
int calculatedOffset = baseOffset;
for(int i=0; i<ad.length; i++)
{
calculatedOffset += (((ArrayDimensions)ad[i]).occursLength * arguments[i]);
}
return calculatedOffset;
}