SlideShare a Scribd company logo
1 of 26
Martin Roy .Net Portfolio Mroy513@gmail.com (513)941-2398 Library Project Phase 1 Introduction:  Create a Windows Forms front end C# application and a business tier for an n-tier project.  Audience: Library employees managing Member and Item information Project Goals: Build parts of the business tier for a library involving members and items.  Create and test two assemblies.  The first assembly is a class library project containing various interfaces and base classes.  The second assembly is a class library project containing various entity, collection, and validation classes used by existing business processes.  Code should follow best practices  Produce a user interface that is intuitive, requiring minimal training for users while minimizing resource utilization Include easily maintainable code, form-based field validation, and all required error handling. Phase 1 – MDI Screen with Member Info The application runs inside an MDI form.  The Member Info screen displays when application is brought up.  It displays the items currently checked out.  Librarian can select one or more checked out items to check in.  If the member has less than four items checked out a check out button will appear.  Juvenile members will show two additional fields: Birth Date and Adult Member ID. Sample Code     public void LoadMemberInfo()         {             memIDTextBox.Text = memID.ToString();             LibraryAccess la = new LibraryAccess();             try             {                 Member member = la.GetMember(memID);                 JuvenileMember juv = member as JuvenileMember;                 if (juv == null)                 {                     AdultMember adult = member as AdultMember;                     if (adult == null)                     {                         memInfoStatusLabel.Text = "
System Error - Try Again"
;                         return;                     }                     else                     {                         LoadAdultData(adult);                     }                 }                 else                 {                     LoadJuvData(juv);                 }                 LoadCheckOutList();             }             catch (LibraryException ex)             {                 memInfoStatusLabel.Text = "
Member Id was not found"
;                 ClearForm();             }             catch             {                 memInfoStatusLabel.Text = "
System Error. Check Member ID and                         Try Again"
;               ClearForm();             }         }         private void LoadAdultData(AdultMember memb)         {             firstNameTextBox.Text = memb.FirstName;             initialTextBox.Text = memb.MiddleInitial;             lastNameTextBox.Text = memb.LastName;             streetTextBox.Text = memb.Street;             cityTextBox.Text = memb.City;             zipTextBox.Text = memb.ZipCode;             expDateTextBox.Text = memb.ExpirationDate.ToString("
d"
);             TimeSpan ts = DateTime.Now - memb.ExpirationDate;             if (ts.Days > 0)             {                 expDateTextBox.BackColor = Color.Yellow;                 memIdExpired = true;             }             else             {                 expDateTextBox.BackColor = Color.WhiteSmoke;                 memIdExpired = false;             }             stateTextBox.Text = memb.State;             phoneTextBox.Text = memb.PhoneNumber;             birthDateLable.Hide();             birthDateTextBox.Hide();             adultIDLabel.Hide();             adultIDTextBox.Hide();     }         private void LoadJuvData(JuvenileMember memb)         {             firstNameTextBox.Text = memb.FirstName;             initialTextBox.Text = memb.MiddleInitial;             lastNameTextBox.Text = memb.LastName;             streetTextBox.Text = memb.Street;             cityTextBox.Text = memb.City;             zipTextBox.Text = memb.ZipCode;             expDateTextBox.Text = memb.ExpirationDate.ToString("
d"
);             TimeSpan ts = DateTime.Now - memb.ExpirationDate;             if (ts.Days > 0)             {                 expDateTextBox.BackColor = Color.Yellow;                 memIdExpired = true;             }             else             {                 expDateTextBox.BackColor = Color.WhiteSmoke;                 memIdExpired = false;             }             stateTextBox.Text = memb.State;             phoneTextBox.Text = memb.PhoneNumber;             birthDateLable.Show();             birthDateTextBox.Show();             adultIDLabel.Show();             adultIDTextBox.Show();             birthDateTextBox.Text =  memb.BirthDate.ToString("
d"
);             adultIDTextBox.Text = memb.AdultMemberID.ToString();          }         public void LoadCheckOutList()         {             LibraryAccess la = new LibraryAccess();             try             {                 ItemsDataSet bookList = la.GetCheckedOutBooks(memID);                 itemsBindingSource.DataSource = bookList;                 if (memIdExpired || bookList.Items.Count > 3)                       checkOutButton.Visible = false;                 else                       checkOutButton.Visible = true;             }             catch             {                memInfoStatusLabel.Text = "
System Error  Try Again"
;             }         } The Member Information screen displays  both Juvenile and  Adult information.  If the Membership has expired than the expiration date is Highlighted and the Check Out button is hidden.  If the member has 4 items checked out the Check Out button is hidden.  The Librarian can highlight any checked out item and click the Check In Selected to check in books. There is a separate Check In screen to check in a book without a Member ID.      Add Adult, Add Juvenile and Check In Screens There are basic edits for the fields. All names must begin with a capital letter. State is selected from a drop down. Zip code must be 5 or 9 numeric characters. Birth date must show member is less than 18 years old. The Adult Member Id must be numeric and will be validated against the data base. ISBN and Copy must be numeric and within valid range.                          Sample Validation Code       public static bool AdultIDValid(string str)         {              int memID;              if (int.TryParse(str, out memID))             {                 if (memID > 0 && memID <= 32767)                 {                     // get from db                     return true;                 }                 else                 {                     return false;                 }             }             else             {                return false;             }         }         /// ,[object Object],         /// ,[object Object],         /// ,[object Object],         public static bool FirstNameValid(string str)         {             if(Regex.IsMatch(str,"
^[A-Z][a-z]{0,14}$"
))                   return true;             else                  return false;         }         /// ,[object Object],         /// ,[object Object],         /// ,[object Object],         public static bool InitialValid(string str)         {             if (Regex.IsMatch(str, @"
^[A-Zs]{0,1}$"
))                 return true;             else                 return false;         }         /// ,[object Object],         /// ,[object Object],         /// ,[object Object],         public static bool LastNameValid(string str)         {            if (Regex.IsMatch(str, "
^[A-Z][a-z]{0,14}$"
))                return true;            else                return false;         }         /// ,[object Object],         /// ,[object Object],         /// ,[object Object],         public static bool ISBNValid(string str)         {              int isbn;              if (int.TryParse(str, out isbn))             {                 if (isbn > 0)                 {                     return true;                 }                 else                 {                     return false;                 }             }             else             {                 return false;             }         }         /// ,[object Object],         /// ,[object Object],         /// ,[object Object],         public static bool CopyNumValid(string str)         {                    short copyNum;               if (short.TryParse(str, out copyNum))             {                 if (copyNum > 0 && copyNum <= 32767)                 {                     return true;                 }                 else                 {                    return false;                 }             }             else             {                 return false;             }         }                  /// ,[object Object],         /// ,[object Object],         /// ,[object Object],         public static bool MemberIDValid(string str)         {             short memID;             if (short.TryParse(str, out memID))             {                 if (memID > 0 && memID <= 32767)                 {                     return true;                 }                 else                 {                     return false;                 }             }             else             {                 return false;             }         }     } } Library Project Phase 2 Introduction:  Create the data access layer for the library application. Audience: Library employees managing Member and Item information Project Goals: Build parts Data access Layer  Develop code to call the store procedures. Return data or throw errors to Business Layer. Develop Store procedures for all processes  Create Entities classes  to pass data between layers. Member Adult (derived from member) Juvenile (derived from member) Item ItemsDataSet (holds multiple Items) Library Exception                                   Sql Examples The following validates the juvenile data than creates a Juvenile Member CREATE proc [dbo].[AddJuvenile]      @firstname varchar(15),     @middleinitial char(1), @lastname varchar(15),     @adultmemno smallint,     @birthdate datetime,     @member_no smallint output as if @firstname = null or @firstname = '' begin    raiserror('First Name is required', 11,1)    return end if @lastname = null or @lastname = '' begin    raiserror('Last Name is required', 11,1)    return end if not exists (select member_no from adult                where member_no = @adultmemno and                datediff(day,getdate(),expr_date) > 0) begin    raiserror('Invalid Adult Member Number', 12,1)    return end if datediff(day,@birthdate,getdate()) > 6575 begin    raiserror('Birthdate is over 17 years not valid for juvenile', 13,1)    return end begin tran insert into member (lastname,firstname,middleinitial) values (@lastname,@firstname,@middleinitial) if @@ERROR <> 0  begin   rollback tran   raiserror('System failure. Unable to add member',16,1)   return end set @member_no = scope_identity() insert into juvenile(member_no,adult_member_no,birth_date) values(@member_no, @adultmemno,@birthdate) if @@ERROR <> 0  begin   rollback tran   raiserror('System failure. Unable to add juvenile',16,1)   return end commit tran The following Proc is used to check in an item CREATE proc [dbo].[CheckInItem]      @isbn int, @copy smallint as if not exists (select isbn from copy where isbn  = @isbn                   and copy_no = @copy) begin    raiserror('Invalid isbn and copy num', 11,1)    return end if exists (select isbn from copy where isbn  = @isbn                   and copy_no = @copy and on_loan = 'N') begin    raiserror('Item not currently on loan', 12,1)    return     end begin tran update copy set on_loan = 'N'  where isbn  = @isbn and copy_no = @copy if @@error <> 0     begin        rollback tran    raiserror('System error - occured in update to copy', 16,1)    return     end insert into loanhist (isbn,copy_no,out_date,title_no,member_no,due_date,         in_date) select isbn,copy_no,out_date,title_no,member_no, due_date,        getdate() from loan where isbn = @isbn and copy_no = @copy  if @@error <> 0     begin        rollback tran    raiserror('System error - occured inserting into loanhist', 16,1)    return     end delete from loan where isbn = @isbn and copy_no = @copy if @@error <> 0     begin        rollback tran    raiserror('System error - occured deleting record from loan', 16,1)    return     end commit tran The following proc will retrieve either the juvenile or adult member CREATE proc [dbo].[GetMemberInfo]      @memno  smallint as  if not exists (select member_no from member where  member_no = @memno) begin      raiserror('Member not found for member number',11,1)      return end if exists(select member_no from adult where  member_no = @memno)   begin      select m.firstname,m.middleinitial,m.lastname,a.street,a.city,a.state,             a.zip,a.phone_no,a.expr_date,null adult_member_no,null birth_date        from member m        join adult a         on a.member_no = m.member_no        where m.member_no = @memno       if @@error <> 0          begin             raiserror('System error getting adult info',16,1)             return          end    end else   begin      select m.firstname,m.middleinitial,m.lastname,a.street,a.city,a.state,             a.zip,a.phone_no,a.expr_date,j.adult_member_no,j.birth_date        from member m        join juvenile j         on m.member_no = j.member_no        join adult a        on a.member_no = j.adult_member_no        where m.member_no = @memno       if @@error <> 0          begin             raiserror('System error getting juvenile info',16,1)             return          end end Sample Access Layer Code Check in an item throwing an exception if insert failes /// ,[object Object], /// ,[object Object], /// ,[object Object], /// ,[object Object], public void CheckInItem(int isbn, short copy) {     try     {         using (SqlConnection cnn = new SqlConnection(             Properties.Settings.Default.LibraryConnectionString))         {             using (SqlCommand cmd = new SqlCommand("
CheckInItem"
, cnn))             {                 cmd.CommandType = CommandType.StoredProcedure;                 cmd.Parameters.AddWithValue("
@isbn"
, isbn);                 cmd.Parameters.AddWithValue("
@copy"
, copy);                 cnn.Open();                 int results = cmd.ExecuteNonQuery();                 if (results > 0)                 {                     return;                 }                 else                 {                     LibraryException lex = new LibraryException("
System error no rows were updated"
);                     throw lex;                 }             }         }     }     catch (SqlException ex)     {         if (ex.Class == 11)             throw new LibraryException(ErrorCodes.ItemNotFound, ex.Message);         else             if (ex.Class == 12)                 throw new LibraryException(ErrorCodes.ItemNotOnLoan, sex.Message);             else                 throw new LibraryException(ErrorCodes.CheckInFailed,  This procedures gets the member info.  It determins if this is a juvenile or adault depending on the presence of an adult member ID. public Member GetMember(short memID) {     try     {         using (SqlConnection cnn = new SqlConnection(             Properties.Settings.Default.LibraryConnectionString))         {             using (SqlCommand cmd = new SqlCommand("
GetMemberInfo"
, cnn))             {                 cmd.CommandType = CommandType.StoredProcedure;                 cmd.Parameters.AddWithValue("
@memno"
, memID);                 cnn.Open();                 using (SqlDataReader rdr = cmd.ExecuteReader())                 {                     if (rdr.Read())                     {                         if (rdr["
adult_member_no"
].ToString() == "
"
)                         {                             AdultMember amem = new AdultMember();                             LoadMember(rdr, amem, memID);                             return amem;                         }                         else                         {                             JuvenileMember jmem = new JuvenileMember();                             LoadMember(rdr, jmem, memID);                             return jmem;                         }                     }                     else                     {                         LibraryException lex = new LibraryException("
System error no rows returned"
);                         throw lex;                     }                 }             }         }     }     catch (SqlException sqex)     {         if (sqex.Class == 11)             throw new LibraryException(ErrorCodes.NoSuchMember, sqex.Message);         else             throw new LibraryException(ErrorCodes.GenericException, sqex.Message, sqex);     } } Sample Item Entity public class Item {     private int isbn;     private short copyNumber;     private string title;     private string author;     private short memberNumber;     private DateTime checkoutDate;     private DateTime dueDate;          /// ,[object Object],     /// ,[object Object],     /// ,[object Object],     /// ,[object Object],     /// ,[object Object],     /// ,[object Object],     /// ,[object Object],     /// ,[object Object],     public Item(int Isbn, short copy, string itemtitle, string authr, short memno,         DateTime outDate, DateTime due)     {         isbn = Isbn;         copyNumber = copy;         title = itemtitle;         author = authr;         memberNumber = memno;         checkoutDate = outDate;         dueDate = due;     }     /// ,[object Object],     public int ISBN     {         get { return isbn; }     }     /// ,[object Object],     public short CopyNumber     {         get { return copyNumber; }     }     /// ,[object Object],     public string Title     {         get { return title; }     }     /// ,[object Object],     public string Author     {         get { return author; }     }     /// ,[object Object],     public short MemberNumber     {         get { return memberNumber; }     }     /// ,[object Object],     public DateTime CheckoutDate     {         get { return checkoutDate; }     }     /// ,[object Object],     public DateTime DueDate     {         get { return dueDate; }         set { dueDate = value; }     } } Library Project Phase 3 Introduction:  Replace Windows front-end with Web front-end  Audience: Library employees managing Member and Item information Project Goals: Replace all Windows forms with Web front end Additional requirements. New screen to add a new item to inventory Automatic conversion to an adult Membership if Juvenile is age is 18 or above.  Membership renewal for expired Member IDs Add Security Add logon screen Prevent access to any screen without valid login        Member Information Window The application runs inside a Master Page.  The Member Info screen displays when after a successful login.  It displays the items currently checked out.  Librarian can select one or more checked out items to check in.  If the member has less than four items checked out a check out button will appear.  Juvenile members will show two additional fields: Birth Date and Adult Member ID.    New Features added.  If member is expired it will transfer to a new window asking the librarian if they want to renew.  Also if Juvenile is over 17 their membership will automatically be changed to an adult member.  A notification of change is sent to librarian. Sample Code This code will set up the screen with the current user info when returning from the other screens. protected void Page_Load(object sender, EventArgs e)     {         if (!Page.IsPostBack)         {             ClearForm();         }         object newid = Session["
NewMemID"
];         if(Session["
NewMemID"
] != null &&                    (short)Session["
NewMemID"
] != 0)         {             MemID = (short)Session["
NewMemID"
];             txtMemberID.Text = MemID.ToString();             Session["
NewMemID"
] = (short) 0;             Session["
MemID"
] = MemID;             LoadMemberInfo();         }         else         {             if (Session["
MemID"
] != null)             {                 if (short.Parse(txtMemberID.Text) == 0)                 {                     MemID = (short)Session["
MemID"
];                     txtMemberID.Text = MemID.ToString();                     LoadMemberInfo();                 }             }         }     }     private void LoadMemberInfo()     {         LibraryAccess la = new LibraryAccess();         try         {             Member member = la.GetMember(memID);             JuvenileMember juv = member as JuvenileMember;             if (juv == null)             {                 AdultMember adult = member as AdultMember;                 if (adult == null)                 {                     memInfoStatusLabel.Text = "
System Error - Try Again"
;                     return;                 }                 else                 {                     LoadAdultData(adult);                 }             }             else             {                 LoadJuvData(juv);             }             if ( TextBoxBirthDate.Text != "
"
  )             {                 DateTime bday = DateTime.Parse(TextBoxBirthDate.Text);                 TimeSpan ts = DateTime.Now - bday;                 if ((ts.Days - 5) / 365 > 17)                 {                         CreateAdultIDfromJuv();                 }             }                      }         catch (LibraryException ex)         {             memInfoStatusLabel.Text = ex.Message;             ClearForm();         }         catch         {             memInfoStatusLabel.Text = "
System Error. Check Member ID and Try Again"
;             ClearForm();         }     }     private void LoadAdultData(AdultMember memb)     {            TextBoxFirstName.Text = memb.FirstName;            TextBoxInit.Text = memb.MiddleInitial;            TextBoxLastName.Text = memb.LastName;            TextBoxStreet.Text = memb.Street;            TextBoxCity.Text = memb.City;            TextBoxZip.Text = memb.ZipCode;            TextBoxExpDate.Text = memb.ExpirationDate.ToString("
d"
);            TimeSpan ts = DateTime.Now - memb.ExpirationDate;            if (ts.Days > 0)           {               if (Session["
RenewalRefused"
] == null)                   Response.Redirect("
~/Renew.aspx"
, true);               else               {                   if ((bool)Session["
RenewalRefused"
])                   {                       TextBoxExpDate.BackColor = Color.Yellow;                       memIdExpired = true;                       Session["
RenewalRefused"
] = null;                   }               }           }           else           {               Session["
RenewalRefused"
] = null;               TextBoxExpDate.BackColor = Color.WhiteSmoke;               memIdExpired = false;           }         TextBoxState.Text = memb.State;         TextBoxPhone.Text = memb.PhoneNumber;         LabelBirthDate.Visible = false;         TextBoxBirthDate.Text = "
"
;         TextBoxBirthDate.Visible = false;         LabelAdultID.Visible= false;         TextBoxAdultID.Visible = false; }     private void LoadJuvData(JuvenileMember memb)     {            TextBoxFirstName.Text = memb.FirstName;            TextBoxInit.Text = memb.MiddleInitial;            TextBoxLastName.Text = memb.LastName;            TextBoxStreet.Text = memb.Street;            TextBoxCity.Text = memb.City;            TextBoxZip.Text = memb.ZipCode;            TextBoxExpDate.Text = memb.ExpirationDate.ToString("
d"
);            TimeSpan ts = DateTime.Now - memb.ExpirationDate;            if (ts.Days > 0)           {               TextBoxExpDate.BackColor = Color.Yellow;                memIdExpired = true;           }           else           {               TextBoxExpDate.BackColor = Color.WhiteSmoke;               memIdExpired = false;           }         TextBoxState.Text = memb.State;         TextBoxPhone.Text = memb.PhoneNumber;          LabelBirthDate.Visible = true;         TextBoxBirthDate.Text =  memb.BirthDate.ToString("
d"
);         TextBoxBirthDate.Visible =true;         LabelAdultID.Visible= true;         TextBoxAdultID.Visible = true;         TextBoxAdultID.Text = memb.AdultMemberID.ToString();     }                 New Add Item Screen Librarian can enter the ISBN and click Get Info for ISBN to get current information about an Item.  It will also show the highest number copy number used. The librarian can add a new copy by updating the copy no and clicking Add New Item.    To add a new ISBN the librarian must enter all the information except Synopsis is optional.  Selected Code for Add Item Screen  protected void ButtonGetInfo_Click(object sender, EventArgs e)     {         LibraryAccess la = new LibraryAccess();         try         {             ItemAddInfo itm = la.GetLastCopyItem(short.Parse(TextBoxISBN.Text));             TextBoxCopy.Text = "
"
;             TextBoxTitle.Text = itm.Title;             TextBoxAuthor.Text = itm.Author;             TextBoxSynopsis.Text = itm.Synopsis;             TextBoxTrans.Text = itm.Translation;             LabelLastCopy.Text = string.Format("
Highest Copy No used {0}"
, itm.CopyNumber);             if (itm.Cover == "
HARDBACK"
 || itm.Cover == "
Hardback"
)             {                 RadioButtonSoft.Checked = false;                 RadioButtonHard.Checked = true;             }             else             {                 RadioButtonHard.Checked = false;                 RadioButtonSoft.Checked = true;             }             if (itm.Loanable == "
Y"
 || itm.Loanable == "
y"
)             {                 RadioButtonInHouse.Checked = false;                 RadioButtonLoan.Checked = true;             }             else             {                 RadioButtonLoan.Checked = false;                 RadioButtonInHouse.Checked = true;             }         }         catch (LibraryException lex)         {             TextBoxTitle.Text = "
"
;             TextBoxAuthor.Text = "
"
;             TextBoxSynopsis.Text = "
"
;             TextBoxTrans.Text = "
"
;             LabelLastCopy.Text = "
"
;             RadioButtonHard.Checked = true;             RadioButtonLoan.Checked = true;             LabelErrorMsg.Text = lex.Message;         }         catch (Exception ex)         {             TextBoxTitle.Text = "
"
;             TextBoxAuthor.Text = "
"
;             TextBoxSynopsis.Text = "
"
;             TextBoxTrans.Text = "
"
;             LabelLastCopy.Text = "
"
;             RadioButtonHard.Checked = true;             RadioButtonLoan.Checked = true;             LabelErrorMsg.Text = "
System Error "
 + ex.Message;         }     }     /// ,[object Object],     /// ,[object Object],     /// ,[object Object],     protected void ButtonAddItem_Click(object sender, EventArgs e)     {         try         {             LibraryAccess la = new LibraryAccess();             string cover;             if(RadioButtonHard.Checked == true)                 cover = "
HARDBACK"
;             else                 cover = "
SOFTBACK"
;             string loanable;             if(RadioButtonLoan.Checked == true)                 loanable = "
Y"
;             else                 loanable = "
N"
;             la.AddNewItem(int.Parse(TextBoxISBN.Text), short.Parse(TextBoxCopy.Text),                 TextBoxTitle.Text, TextBoxAuthor.Text, TextBoxSynopsis.Text, TextBoxTrans.Text,                  cover, loanable);              LabelErrorMsg.Text = "
Item Added"
;         }         catch (LibraryException lex)         {             LabelErrorMsg.Text = lex.Message;         }         catch (Exception ex)         {             LabelErrorMsg.Text = ex.Message;         }     } }
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy
Portfolio Martin Roy

More Related Content

What's hot

Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConRafael Dohms
 
Christopher Latham Portfolio
Christopher Latham PortfolioChristopher Latham Portfolio
Christopher Latham Portfoliolathamcl
 
Javascript foundations: variables and types
Javascript foundations: variables and typesJavascript foundations: variables and types
Javascript foundations: variables and typesJohn Hunter
 
Refactoring group 1 - chapter 3,4,6
Refactoring   group 1 - chapter 3,4,6Refactoring   group 1 - chapter 3,4,6
Refactoring group 1 - chapter 3,4,6Duy Lâm
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languagesArthur Xavier
 
What's New In Python 2.6
What's New In Python 2.6What's New In Python 2.6
What's New In Python 2.6Richard Jones
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix itRafael Dohms
 
Object Calisthenics Adapted for PHP
Object Calisthenics Adapted for PHPObject Calisthenics Adapted for PHP
Object Calisthenics Adapted for PHPChad Gray
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHPGuilherme Blanco
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsGuilherme Blanco
 
JavaScript Literacy
JavaScript LiteracyJavaScript Literacy
JavaScript LiteracyDavid Jacobs
 
Object-oriented Javascript
Object-oriented JavascriptObject-oriented Javascript
Object-oriented JavascriptDaniel Ku
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf Conference
 
Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsSam Hennessy
 
jrubykaigi2010-lt-rubeus
jrubykaigi2010-lt-rubeusjrubykaigi2010-lt-rubeus
jrubykaigi2010-lt-rubeusTakeshi AKIMA
 

What's hot (20)

Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnCon
 
Christopher Latham Portfolio
Christopher Latham PortfolioChristopher Latham Portfolio
Christopher Latham Portfolio
 
Javascript foundations: variables and types
Javascript foundations: variables and typesJavascript foundations: variables and types
Javascript foundations: variables and types
 
Eclipse Banking Day
Eclipse Banking DayEclipse Banking Day
Eclipse Banking Day
 
Refactoring group 1 - chapter 3,4,6
Refactoring   group 1 - chapter 3,4,6Refactoring   group 1 - chapter 3,4,6
Refactoring group 1 - chapter 3,4,6
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languages
 
What's New In Python 2.6
What's New In Python 2.6What's New In Python 2.6
What's New In Python 2.6
 
Javascript essentials
Javascript essentialsJavascript essentials
Javascript essentials
 
You code sucks, let's fix it
You code sucks, let's fix itYou code sucks, let's fix it
You code sucks, let's fix it
 
Object Calisthenics Adapted for PHP
Object Calisthenics Adapted for PHPObject Calisthenics Adapted for PHP
Object Calisthenics Adapted for PHP
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
 
JavaScript Literacy
JavaScript LiteracyJavaScript Literacy
JavaScript Literacy
 
Presentation1
Presentation1Presentation1
Presentation1
 
Solid in practice
Solid in practiceSolid in practice
Solid in practice
 
Object-oriented Javascript
Object-oriented JavascriptObject-oriented Javascript
Object-oriented Javascript
 
Growing jQuery
Growing jQueryGrowing jQuery
Growing jQuery
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
 
Adding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy ApplicationsAdding Dependency Injection to Legacy Applications
Adding Dependency Injection to Legacy Applications
 
jrubykaigi2010-lt-rubeus
jrubykaigi2010-lt-rubeusjrubykaigi2010-lt-rubeus
jrubykaigi2010-lt-rubeus
 

Similar to Portfolio Martin Roy

SetFocus Portfolio
SetFocus PortfolioSetFocus Portfolio
SetFocus Portfoliodonjoshu
 
Getting the following errorsError 1 error C2436 {ctor} mem.pdf
Getting the following errorsError 1 error C2436 {ctor}  mem.pdfGetting the following errorsError 1 error C2436 {ctor}  mem.pdf
Getting the following errorsError 1 error C2436 {ctor} mem.pdfherminaherman
 
I have the following code and I need to know why I am receiving the .pdf
I have the following code and I need to know why I am receiving the .pdfI have the following code and I need to know why I am receiving the .pdf
I have the following code and I need to know why I am receiving the .pdfezzi552
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsAlfonso Peletier
 
Michael Colon Portfolio
Michael Colon PortfolioMichael Colon Portfolio
Michael Colon Portfoliomichael_colon
 
Reason - introduction to language and its ecosystem | Łukasz Strączyński
Reason - introduction to language and its ecosystem | Łukasz StrączyńskiReason - introduction to language and its ecosystem | Łukasz Strączyński
Reason - introduction to language and its ecosystem | Łukasz StrączyńskiGrand Parade Poland
 
Domain Driven Design with the F# type System -- NDC London 2013
Domain Driven Design with the F# type System -- NDC London 2013Domain Driven Design with the F# type System -- NDC London 2013
Domain Driven Design with the F# type System -- NDC London 2013Scott Wlaschin
 
Static types on javascript?! Type checking approaches to ensure healthy appli...
Static types on javascript?! Type checking approaches to ensure healthy appli...Static types on javascript?! Type checking approaches to ensure healthy appli...
Static types on javascript?! Type checking approaches to ensure healthy appli...Arthur Puthin
 
This project will implement a simple usernamepassword lookup system.pdf
This project will implement a simple usernamepassword lookup system.pdfThis project will implement a simple usernamepassword lookup system.pdf
This project will implement a simple usernamepassword lookup system.pdfezhilvizhiyan
 
Library Website
Library WebsiteLibrary Website
Library Websitegholtron
 
Clean code in JavaScript
Clean code in JavaScriptClean code in JavaScript
Clean code in JavaScriptMathieu Breton
 
Code Include libraries. import javax.swing.JOptionPane;.pdf
Code Include libraries. import javax.swing.JOptionPane;.pdfCode Include libraries. import javax.swing.JOptionPane;.pdf
Code Include libraries. import javax.swing.JOptionPane;.pdfankitmobileshop235
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Scott Wlaschin
 
Library Management System - V1.0
Library Management System - V1.0Library Management System - V1.0
Library Management System - V1.0JamesMuturi
 

Similar to Portfolio Martin Roy (20)

SetFocus Portfolio
SetFocus PortfolioSetFocus Portfolio
SetFocus Portfolio
 
Email Program By Marcelo
Email Program By MarceloEmail Program By Marcelo
Email Program By Marcelo
 
Email Program By Marcelo
Email Program By MarceloEmail Program By Marcelo
Email Program By Marcelo
 
Email Program By Marcelo
Email Program By MarceloEmail Program By Marcelo
Email Program By Marcelo
 
Clean code
Clean codeClean code
Clean code
 
Getting the following errorsError 1 error C2436 {ctor} mem.pdf
Getting the following errorsError 1 error C2436 {ctor}  mem.pdfGetting the following errorsError 1 error C2436 {ctor}  mem.pdf
Getting the following errorsError 1 error C2436 {ctor} mem.pdf
 
I have the following code and I need to know why I am receiving the .pdf
I have the following code and I need to know why I am receiving the .pdfI have the following code and I need to know why I am receiving the .pdf
I have the following code and I need to know why I am receiving the .pdf
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
 
Michael Colon Portfolio
Michael Colon PortfolioMichael Colon Portfolio
Michael Colon Portfolio
 
Reason - introduction to language and its ecosystem | Łukasz Strączyński
Reason - introduction to language and its ecosystem | Łukasz StrączyńskiReason - introduction to language and its ecosystem | Łukasz Strączyński
Reason - introduction to language and its ecosystem | Łukasz Strączyński
 
Domain Driven Design with the F# type System -- NDC London 2013
Domain Driven Design with the F# type System -- NDC London 2013Domain Driven Design with the F# type System -- NDC London 2013
Domain Driven Design with the F# type System -- NDC London 2013
 
recap-js-and-ts.pdf
recap-js-and-ts.pdfrecap-js-and-ts.pdf
recap-js-and-ts.pdf
 
Static types on javascript?! Type checking approaches to ensure healthy appli...
Static types on javascript?! Type checking approaches to ensure healthy appli...Static types on javascript?! Type checking approaches to ensure healthy appli...
Static types on javascript?! Type checking approaches to ensure healthy appli...
 
Php & my sql
Php & my sqlPhp & my sql
Php & my sql
 
This project will implement a simple usernamepassword lookup system.pdf
This project will implement a simple usernamepassword lookup system.pdfThis project will implement a simple usernamepassword lookup system.pdf
This project will implement a simple usernamepassword lookup system.pdf
 
Library Website
Library WebsiteLibrary Website
Library Website
 
Clean code in JavaScript
Clean code in JavaScriptClean code in JavaScript
Clean code in JavaScript
 
Code Include libraries. import javax.swing.JOptionPane;.pdf
Code Include libraries. import javax.swing.JOptionPane;.pdfCode Include libraries. import javax.swing.JOptionPane;.pdf
Code Include libraries. import javax.swing.JOptionPane;.pdf
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
 
Library Management System - V1.0
Library Management System - V1.0Library Management System - V1.0
Library Management System - V1.0
 

Recently uploaded

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 

Recently uploaded (20)

Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 

Portfolio Martin Roy

  • 1.